Johnson-Trotter(JT)算法生成排列

本文介绍了Johnson-Trotter算法,通过减治法解决生成所有n!个排列的问题。算法首先初始化一个方向向左的元素数组,然后在循环中找到最大移动元素并进行交换,调整元素方向,直到所有排列都被生成。该算法可灵活应用于生成N个不重复元素的排列,用户需自定义比较器接口。
摘要由CSDN通过智能技术生成

    对于生成{1,……,n}的所有n!个排列的问题,我们可以利用减治法,该问题的规模减一就是要生成所有(n-1)!个排列。假设这个小问题已经解决了,我们可以把n插入到n-1个元素的每一种排列中的n可能的位置中去,来得到较大规模大问题的一个解。按照这种方式生成的所有排列都是独一无二的,并且他们的总数应该是n(n-1)!=n!。这样,我们都得到了{1,……,n}的所有排列。

    JohnsonTrotter算法实现形式。

    JohnsonTrotter(n)

        输入:一个正整数n

        输出:{1,……,n}的素有排列的列表

        将第一个排列初始化为方向向左的元素数组

        while 存在一个移动元素k do

            求最大的移动元素k

            把k和它箭头指向的相邻元素互换

            调转所有大于k的元素的方向

            将新排列添加到列表

(摘自算法设计与分析基础)

 

    下午自己实现了一下这个算法,将其改成可以把N个不重复的元素排列出来,程序中使用到的比较器提供接口需要自己去实现,程序运行需要把使用者自己实现的比较器注入程序。自我感觉程序灵活性还可以。

/**
 * 使用JT算法进行排列组合。
 * 注意:请务必保持范型和比较接口范型一致,否则可能产生不可预
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值