要求:使用非遞迴的方法按照字典序輸出全排列
思路:這次以「1 5 4 3 2」為例,下乙個排列是「2 1 3 4 5」
從後往前找,找到第乙個連續遞增的兩個數字,找到了「1 5」
重新從後往前找,找到第乙個大於「1」的數字,找到了「2」,「1」就是步驟三中找到的第乙個數字
找到「2」之後,將「1」和「2」互換,換成了「2 5 4 3 1」
然後將「5」後面的全部數字翻轉(包括「5」),「5」就是步驟三找到的第二個數字,變成了「2 1 3 4 5」,完事
**實現:
int
main
(int argc,
char
* ar**)
//每次操作之後,都不必恢復,因為原理是找當前排列的下乙個排列
}
如果需要逆序輸出
將初始陣列置為正序的最後乙個排列(5 4 3 2 1)
將步驟三四的小於改為大於即可。
因為5的全排列太多了,所以這裡是4的全排列1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 1 3
2 4 3 1
3 1 2 4
3 1 4 2
3 2 1 4
3 2 4 1
3 4 1 2
3 4 2 1
4 1 2 3
4 1 3 2
4 2 1 3
4 2 3 1
4 3 1 2
4 3 2 1
非遞迴全排列實現
include include include include include include include includeusing namespace std const int max size 1000 尋找下乙個排列 假設 某個序列為 d1 d2 d3 dn 那麼在dn前找第乙個 比dn...
全排列 遞迴與非遞迴實現
全排列問題在公司筆試的時候非經常見,這裡介紹其遞迴與非遞迴實現。簡單地說 就是第乙個數分別以後面的數進行交換 e.g e a b c 則 prem e a.perm b,c b.perm a,c c.perm a,b 然後a.perm b,c ab.perm c ac.perm b abc acb....
全排列的非遞迴實現
以前寫過全排列的遞迴演算法,思路和實現都比較簡單。上週練習python,遇到了全排列的問題,就想著用非遞迴實現實現以下。沒想到從中午想到了半夜,草稿用了好幾張,也沒想到好的idea。第二天早上在地鐵上,在手機撥號頁面演示了一會,竟然有了思路。假定 從小打大排序,稱為正序,反之稱為逆序,我的思路是 以...