如何输出一个数组的全排列?

2013-09-18 16:37:09 +08:00
 itfanr
数组为:1 2 3 4 5 6

语言不限

感觉好难啊!
7216 次点击
所在节点    程序员
27 条回复
xlhuang
2013-09-20 02:56:28 +08:00
tioover
2013-09-20 22:30:42 +08:00
http://gist.github.com/tioover/6638449

其实应该用Scheme 来写。
yukirock
2013-09-21 02:16:36 +08:00
《组合数学》中提到过一种全排列升成算法。

给定一个整数 k,在其上方标记一个左箭头或右箭头以示方向,如:

< >
k 或 k

对于 {1..k} 的一个排列,对于其中每一个数都给定一个方向。如果一个整数 k 的箭头指向一个与其相邻但是比它小的整数,那么 k 即为「活动的」。例如对于

>>><>>
263154

356 是活动的。

可以得出如下结论:

* 1 一定不是活动的,因为 1 是最小的整数。
* 除了以下两种情况,{1..n} 中最大的整数 n 总是活动的:n 在最左边且它的箭头朝左,或 n 在最右边且它的箭头朝右。

算法如下。



<<..<
12..n

开始。

当存在一个活动的整数时,执行:

1. 求出最大的活动整数 m
2. 交换 m 及其箭头所指的与其相邻的整数
3. 交换所有满足 p>m 的整数 p 的方向。

以 n=4 为例:

<<<<
1234

<<<<
1243

<<<<
1423

<<<<
4123

><<<
4132

<><<
1432

<<><
1342

<<<>
1324

<<<<
3124

<<<<
3142

(略)

<<>>
2134

到 2134 中没有活动整数,算法终止。此时已经打出 {1234} 的全排列。
tioover
2013-09-21 02:23:05 +08:00
我之前发的怎么没有了?

http://gist.github.com/tioover/6638449
coldear
2013-09-21 06:03:31 +08:00
kedebug
2013-09-21 11:47:10 +08:00
建议楼主平时多积累些基础的算法知识,像全排列这样经典的递归算法应该信手拈来才是。
itfanr
2013-09-21 12:39:46 +08:00
@kedebug 笔试考了 拈不来

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/82917

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX