根据this page,可以输出一个排列列表,其中每个新排列只是一个不同于先前排列的单个相邻交换。这是详尽无遗的,它经历了所有的排列。
我很难从描述中理解算法。我想编写一个算法来输出每个排列之间所需的交换。
答案 0 :(得分:2)
当决定需要交换的下一个元素由置换的当前状态定义时,生成下一个交换并不比生成下一个置换更容易。
如果我必须生成任何一个,我的目标是实现Even's speedup。在那里描述的算法应该相当容易翻译成大多数编程语言。然后,您可以输出排列并标记交换,如果您要求。以下Python代码将执行此操作:
class Elt(object):
def __init__(self, dir, name):
self.dir = dir
self.name = name
n = 6
p = [Elt(0 if i == 0 else -1, i + 1) for i in range(n)]
while(True):
print(' '.join(str(i.name) for i in p))
oldpos = None
for i in range(n):
if p[i].dir != 0 and (oldpos is None or p[oldpos].name < p[i].name):
oldpos = i
if oldpos is None:
break
mover = p[oldpos]
newpos = oldpos + mover.dir
p[oldpos] = p[newpos]
p[newpos] = mover
print(' '*(oldpos + newpos) + 'X')
if mover.dir == -1 and (newpos == 0 or p[newpos - 1].name > mover.name):
mover.dir = 0
if mover.dir == 1 and (newpos == (n - 1) or p[newpos + 1].name > mover.name):
mover.dir = 0
for i in range(newpos):
if p[i].name > mover.name:
p[i].dir = 1
for i in range(newpos, n):
if p[i].name > mover.name:
p[i].dir = -1
答案 1 :(得分:0)
可以找到这个算法的简单解释,以及Java代码here