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

本文介绍了如何使用LexicographicPermute算法在Python中生成组合对象的字典序排列。该算法能确保排列的自然顺序,如n到1的顺序出现在列表末尾。通过伪代码和代码实现,详细解析了算法的运行过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有人说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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值