全排列演算法的字典序排列

2022-07-31 04:51:10 字數 655 閱讀 6193

之前在中描述了全排列演算法的遞迴解法,這裡再說一種演算法--字典序排列。

字典序排列就是按照字典a-z,1-9的順序給出字串的順序全排列,例如abc的全排列就是從abc一直排到cba。那麼給定乙個字串,怎麼找出恰好大於該字串的下乙個排列呢?

我們考慮如下的步驟:

1、假設字串為p1p2….pn,我們從後往前尋找第乙個符合pj

j+1條件的字元pj,也就是說,p1p2…pj-1pjpj+1…pn中pj

j+1並且pj+1>pj+2>…pn。

2、再次從後往前尋找第乙個大於pj的字元pk,也就是說,p1p2pj-1pjpj+1…pk-1pkpk+1…pn中從後往前pk>pj並且pk+1,…pn

j,可以看出pk也是比pj大的數中最小的乙個,因為最差情況下k=j+1。

3、交換pj和pk,這樣在p1p2…pj前j個字元變大了,pj放到原來pk的位置上同樣符合pj+1>…pk-1>pj>pk+1…>pn。

4、為了得到恰好大於該字串的下乙個排列,我們看到從j+1之後的字串是降序排列的,我們將其翻轉,就可以得到想要的結果了。

那麼什麼時候整個過程結束呢?當再也找不到符合條件的j時,說明當前的字串已經是逆序的了,也就是字典序最大。

void permutation(char* str)

}}

全排列 字典序排列

include includeusing namespace std define dig num 4 void cal int str int first int last cout endl if first last bool get f l int list int former int l...

字典序全排列

思路 從左向右找到不符合遞增規律的第乙個數,比如1,2,5,4,3中的這個數就是2,將其與其右面遞增序列中的比他大的最小數,比如在前面例子中的3互換,得到1,3,5,4,2,最後,將該數右邊的遞增序列排序,得到1,3,2,4,5即可。上面這個是求某乙個數的下乙個排列,而全排列只需按這個思路,將初始陣...

字典序全排列

給出正整數n,則1 n這n個數可以構成n!種排列,把這些排列按照從小到大的順序 字典順序 列出,如n 3時,列出1 2 3,1 3 2,2 1 3,2 3 1,3 1 2,3 2 1 這6個排列。字典序演算法如下 假設這n個數的某乙個排列為 p p1 p2 p3.pj 1 pj pj 1.pk 1 ...