給出正整數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 pk pk+1...pn
1.從該序列的最右端開始向左找出第乙個比與自己相鄰的右邊數小的數,記其下標為j,即j = max.
2.找出pj右邊比pj大的最小數pk.
3.交換pj,pk.此時序列變為 p』: p1 p2 p3...pj-1 pk pj+1...pk-1 pj pk+1...pn
4.將pj+1...pn 倒轉,即得到此序列的後乙個序列 p」: p1 p2 p3...pj-1 pn...pk+1 pj pk-1...pj+1
例:1 2 3 5 7 4 6 10 9 8為1-10的乙個排列
1.從該序列的最右端開始向左找出第乙個比與自己相鄰的右邊數小的數6,其下標為7
2.6右邊比6大的最小數為8
3.交換6,8得到1 2 3 5 7 4 8 10 9 6
**實現:
1//對1-n的某個已知排列求按字典序其後的第s個排列
2 #include3 #include4
using
namespace
std;
5const
int n = 1030;6
//將陣列下標a-b的元素翻轉
7void flip(int n,int a,int
b)11}12
//求第k個排列
13void order(int n,int a,int
s)24}25
if(flag)29}
30else
3738}39
}40swap(a[j],a[k]);
41 flip(a,j+1
,n);42}
43}44}
45int
main()
53order(n,num,k);
54for(int i = 1; i <= n; i ++)
57 printf("\n"
);58}59
return0;
60 }
另外表示可以用c++ stl中的next_permutation函式生成全排列。。
全排列 字典序排列
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即可。上面這個是求某乙個數的下乙個排列,而全排列只需按這個思路,將初始陣...
全排列(按字典序)
描述 給定乙個由不同的小寫字母組成的字串,輸出這個字串的所有全排列。我們假設對於小寫字母有 a b y z 而且給定的字串中的字母已經按照從小到大的順序排列。輸入輸入只有一行,是乙個由不同的小寫字母組成的字串,已知字串的長度在1到6之間。輸出輸出這個字串的所有排列方式,每行乙個排列。要求字母序比較小...