字典序全排列
2017-07-10 16:22
741 查看
字典序法的描述如下:
设P是1~n的一个全排列:p=p1p2......pn=p1p2......pj−1pjpj+1......pk−1pkpk+1......pn
从排列的右端开始,找出第一个比右边字符小的字符的序号j(j从左端开始计算),即j=max{i|pi<pi+1}
在pj的右边的字符中,找出所有比pj大的字符中最小的字符pk,即k=max{i|pi>pj}(右边的字符从右至左是递增的,因此k是所有大于pj的字符中序号最大者)
对换pj,pk
再将pj+1......pk−1pkpk+1pn倒转得到排列p′′=p1p2.....pj−1pjpn.....pk+1pkpk−1.....pj+1,这就是排列p的下一个下一个排列。
例如839647521是数字1~9的一个排列。从它生成下一个排列的步骤如下:
自右至左找出排列中第一个比右边数字小的数字4 839647521
在该数字后的数字中找出比4大的数中最小的一个5 839647521
将5与4交换 839657421
将7421倒转 839651247
所以839647521的下一个排列是839651247。
839651247的下一个排列是839651274。
设P是1~n的一个全排列:p=p1p2......pn=p1p2......pj−1pjpj+1......pk−1pkpk+1......pn
从排列的右端开始,找出第一个比右边字符小的字符的序号j(j从左端开始计算),即j=max{i|pi<pi+1}
在pj的右边的字符中,找出所有比pj大的字符中最小的字符pk,即k=max{i|pi>pj}(右边的字符从右至左是递增的,因此k是所有大于pj的字符中序号最大者)
对换pj,pk
再将pj+1......pk−1pkpk+1pn倒转得到排列p′′=p1p2.....pj−1pjpn.....pk+1pkpk−1.....pj+1,这就是排列p的下一个下一个排列。
例如839647521是数字1~9的一个排列。从它生成下一个排列的步骤如下:
自右至左找出排列中第一个比右边数字小的数字4 839647521
在该数字后的数字中找出比4大的数中最小的一个5 839647521
将5与4交换 839657421
将7421倒转 839651247
所以839647521的下一个排列是839651247。
839651247的下一个排列是839651274。
相关文章推荐
- 全排列-字典序
- hdu 1027 字典序全排列
- 字典序序号与全排列的关系【全排列与序号换算方法】
- poj 1731 字典序全排列
- 字典序全排列(java实现)
- 字典序全排列
- C++实现全排列(字典序)
- 面试:如何找出字符串的字典序全排列的第N种
- 字典序全排列算法研究
- 校OJ 17086 字典序的全排列
- 【CodeForces】96B - Lucky Numbers (easy)(模拟,字典序全排列)
- 全排列(按字典序)
- 7.5 字典序全排列
- 字典序全排列
- 生成字典序的全排列
- 全排列(1) ----字典序
- 输出字符串的所有全排列(递归法和非递归,非递归采用组合数学的字典序)
- 全排列与字典序排列
- 第k个字典序全排列
- 全排列——字典序