再論字典序

排列下一個字典序:

 

  1. 從原排列後部開始,對相鄰一對進行比較,若前者小於後者,標記前者下標爲 j;
  2. 令 k = len - 1, k 遞減,尋找到 order[ K ]  > order[  j ] (k > j) ,交換兩項;
  3. 對 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'. (初始排列)

求全排列:

 

心得:

  1. 原先錯誤寫地寫成cmp()傳進去的參數爲數組下標(其實應該是字符型的),導致sort()不能正常工作,而且代碼寫的冗雜,通過一個exist()函數來判斷是否存在下一個排列(其實只要通過next()函數的返回值判斷就可以了)。sort()函數和exist()函數都要調用cmp()函數,於是沒想清楚,參數選錯。
  2. cmp()函數通過對兩個參數的大小寫的判斷再進行比較。

 

cmp()

 

 

main()內輸出部分:

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章