全排列的生成算法
对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来。
字典序法
按照字典序求下一个排列的算法
/*
例 字符集 {1,2,3}, 较小的数字较先 , 这样按字典序生成的全排列是 :123,132,213,231,312,321 。
注意 一个全排列可看做一个字符串,字符串可有前缀、后缀。
*/
生成给定全排列的下一个排列 所谓一个全排列的下一个排列就是这一个排列与下一个排列之间没有其他的排列。这就要求这一个排列与下一个排列有尽可能长的共同前缀,也即变化限制在尽可能短的后缀上。
/*
例 839647521 是 1 — 9 的排列。 1 — 9 的排列最前面的是 123456789 ,最后面的是 987654321 ,从右向左扫描若都是增的,就到了 987654321 ,也就没有下一个了。否则找出第一次出现下降的位置。
算法: 由 P 1P 2…P n 生成的下一个排列的算法如下:
1. 求 i=max{j| P j-1<P j}
2. 求 l=max{k| P i-1<P k }
3. 交换P i-1 与P l得到 P 1 P 2… P i-1 (P i....Pn ) , 将红色部分顺序逆转,得到结果.
例 求 8396 4 7521 的下一个排列
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后的四位数倒转得到结果 8396 5 7 4 21 à 8396 5 1247
详见: