排列下一個字典序:
- 從原排列後部開始,對相鄰一對進行比較,若前者小於後者,標記前者下標爲 j;
- 令 k = len - 1, k 遞減,尋找到 order[ K ] > order[ j ] (k > j) ,交換兩項;
- 對 order[ j + 1 ] 到 order[ k ], 進行從小到大的排序就可以了。
當然C++裏對下一個字典排序是有STL的:
不過對於STL,我的觀點是:用之前必須弄明白它的原理。
http://acm.pku.edu.cn/JudgeOnline/problem?id=1256
the right order of letters is 'A'<'a'<'B'<'b'<...<'Z'<'z'. (初始排列)
求全排列:
心得:
- 原先錯誤寫地寫成cmp()傳進去的參數爲數組下標(其實應該是字符型的),導致sort()不能正常工作,而且代碼寫的冗雜,通過一個exist()函數來判斷是否存在下一個排列(其實只要通過next()函數的返回值判斷就可以了)。sort()函數和exist()函數都要調用cmp()函數,於是沒想清楚,參數選錯。
- cmp()函數通過對兩個參數的大小寫的判斷再進行比較。
cmp()
main()內輸出部分: