生成组合对象的算法——LexicographicPermute算法Python实现

有人说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
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值