按字典序算法全排列

一、简介

原文

按照字典里的排序方法:
先比较第一个字符
i 和 b
b

来自百度百科

算法如下:
设P是数字1~n的一个全排列:p=p1p2......pn=p1p2......pj-1pjpj+1......pk-1pkpk+1......pn
1)从排列的右端开始,找出第一个比右边数字小的数字的序号j(j从左端开始计算),即 j=max{i|pipj}(右边的数从右至左是递增的,因此k是所有大于pj的数字中序号最大者)。
3)对换pj,pk。
4)再将pj+1......pk-1pkpk+1......pn倒转得到排列p'=p1p2.....pj-1pjpn.....pk+1pkpk-1.....pj+1,这就是排列p的下一个排列。

例如:
对于2763541找出字典序的下一个排列。
2763541 (从右至左首先出现的是35,3<5);
2763541 (在3的位置之后从右至左找到第一个比3大的数4);
2764531 (交换3,4的位置);
2764135 (把原来3的位置现在4位置后面的数值5,3,1反转)。

解:就是找到比2763541大的但是同时在1、2、3、4、5、6、7所有排列中比2763541大的程度中最小的一个。为了找到大的程度最小的,一般保证前面的数字位置不调换,优先调换后面数字的排列。首先注意到541是按照降序排列(为什么是降序,只要按照字典序算法,后面就一直这样。),如果我们想通过调换541的位置显然不行,5>4>1,当我们遇到3时,发现有戏,因为在3的后面有比3大的数字,我们把3往后调,把一个大的数字往前调就能把排列整体变大。那么3后面有5和4,我们选择哪一个的,显然是4,因为其增大程度较小。有因为3<4,所以调换位置后后面数字依然是降序,我们只要将其调成升序即可变成最小。

例题LeeCode : 31. Next Permutation

你可能感兴趣的:(algorithm,算法导论读书理解)