【发布时间】:2018-04-05 18:28:04
【问题描述】:
如果初始数组中的值未排序,那么在标准 Steinhaus–Johnson–Trotter 中必须更改什么?比如我的初始数组是312,我想生成如下结果:
312
321
231
213
123
132
我可以引入一个额外的数组来定义每个数字的初始权重,例如w[3]=1, w[1]=2, and w[2]=3 然后比较算法中的权重而不是值,但是是否可以不这样做 - 我想将算法应用于问题这个额外的数组哪里不方便?我正在寻找 C 中的解决方案。
【问题讨论】:
-
如果您特别想要 SJT 生成的订单,您必须跟踪每个元素的位置以及它的移动方向,所以我认为您至少需要 O (n) 额外空间。 (还有其他算法可以为您提供所有排列,但它们不会给出完全相同的顺序。)
-
我可以接受任何顺序,其中连续排列的差异仅在于彼此相邻的元素交换一次。我对最终排列没有要求,即最终排列与第一个排列的不同之处在于一次交换是不必要的。
-
这样的话,看看Heap的算法:en.wikipedia.org/wiki/Heap%27s_algorithm
-
不幸的是,Heap 的算法不能通过交换相邻元素来工作,不是吗?
-
哦,相邻的,没有。我忽略了那部分,抱歉。
标签: c algorithm permutation