字典序算法

和自甴很熟 提交于 2020-03-22 18:01:53
全排列的生成算法
 
对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来。
 
字典序法
按照字典序求下一个排列的算法
 
/*
字符集{1,2,3},较小的数字较先,这样按字典序生成的全排列是:123,132,213,231,312,321
注意一个全排列可看做一个字符串,字符串可有前缀、后缀。
*/
生成给定全排列的下一个排列所谓一个全排列的下一个排列就是这一个排列与下一个排列之间没有其他的排列。这就要求这一个排列与下一个排列有尽可能长的共同前缀,也即变化限制在尽可能短的后缀上。
/*
83964752119的排列。19的排列最前面的是123456789,最后面的是987654321,从右向左扫描若都是增的,就到了987654321,也就没有下一个了。否则找出第一次出现下降的位置。
算法: 由 P1P2…Pn 生成的下一个排列的算法如下:
1. 求 i=max{j| Pj-1<Pj}
2. 求 l=max{k| Pi-1<Pk }
3. 交换Pi-1 与Pl得到P1P2Pi-1 (P i....Pn ) , 将红色部分顺序逆转,得到结果.
839647521的下一个排列
1. 确定i,从左到右两两比较找出后一个数比前一个大的组合,在这里有39 47,然后i取这些组中最到的位置号(不是最大的数)在这两组数中7的位置号最大为6,所以i=6
2.确定l, 找出在i(包括i)后面的所有比i前面那一位大的数的最大的位置号,在此例中7,5 都满足要求,则选5,5的位置号为7,所以 l=7
3. 先将4和5交换,然后将5后的四位数倒转得到结果 839657421à 839651247
 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!