有人说Johnson-Trotter算法生成的排列的次序不是非常自然。例如排列n,n-1,…1的自然位置应该是列表的最后一个。将排列按照升序排列,这样被称为字典序。
伪代码:
算法 LexicographicPermute(n)
//以字典序生成排列
//输入:一个正整数n
//输出:{1,2,...,n}的所有排列的列表
初始化第一个排列为1,2,...,n
while 最后一个排列有两个连续升序的元素 do
找出使得a(i)<a(i+1)的最大的i //a(i+1)>a(i+2)>...>a(n)
找到使得a(i)<a(j)的最大索引j //j>=i+1,因为a(i)<a(i+1)
交换a(i)和a(j) //a(i+1)到a(n)仍保持降序
将a(i+1)到a(n)的元素反序
将这个新排列添加到列表中
代码实现:
def init_list(n): #初始化第一个排列[1,2,3,4....]
init_list=[]
for i in range(1,n+1):
init_list.append(i)
print(init_list)
return init_list
def find_i_j(list):
'''找到使得list[i]<list[i+1]的最大的i //list[i+1]>list[i+2]>list[i+3]>……>list[n]
找到使得list[i]<list[j]的最大索引j //list[i]<list[i+1