|
|
1
23
参见QuickPerm算法,它是迭代的: http://www.quickperm.org/ 编辑: 为清晰起见,请用Ruby重写:
|
|
|
2
6
从一个排列到下一个排列的算法与小学加法非常相似——当溢出发生时,“携带一个”。 下面是我用C编写的一个实现:
|
|
|
3
5
使用1.9的数组排列是一个选项吗?
|
|
|
4
4
下面是我的泛型版本中的下一个置换算法,它与C语言中的STL的NExtx置换函数非常类似(但是如果它是最大可能的排列,就像C++版本一样,它不会反向收集)。 理论上,它应该与任何iComparables的iList<gt;一起工作。
演示/测试代码:
|
|
|
5
2
以下是C中的一个实现,作为扩展方法:
以及单元测试:
方法
|
|
|
6
2
我发现Joey Adams的版本是最易读的,但由于C处理for循环变量的作用域的方式,我无法将其直接移植到C。因此,这是一个稍微修改过的代码版本:
|
|
|
7
2
我还遇到了另一个答案中引用的快速排列算法。此外,我还想分享这个答案,因为我看到了一些可以立即做出的更改,可以将其缩短。例如,如果索引数组“p”的初始化方式稍有不同,则可以省去在循环之前返回第一个排列的麻烦。而且,所有这些循环和if占用了更多的空间。
|
|
|
8
1
您可以迭代调用递归算法吗?如果你真的需要这些东西作为一个列表(你应该清楚地将其内联,而不是分配一堆无意义的内存)。你可以简单地通过它的索引计算动态排列。 很像排列是带着一个加法重新颠倒尾部(而不是还原为0),索引特定的排列值是找到以n为基数的数字,然后是n-1,然后是n-2…通过每次迭代。
布尔值返回您的索引值是否越界。也就是说,它用完了n个值,但仍有剩余的索引。 它不能得到超过12个物体的所有排列。 12!<integer.max_值<13! --但是,它非常漂亮。如果你做了很多错事,可能会有用。 |
|
|
9
1
我已经用JavaScript实现了这个算法。
|
|
|
10
0
我使用的算法来自 here . 这个页面包含很多有用的信息。 编辑 :抱歉,这些是递归的。Uray在他的答案中发布了迭代算法的链接。 我创建了一个PHP示例。除非您真的需要返回所有的结果,否则我只创建如下的迭代类:
注意,它将每个PHP数组视为索引数组。 |