非遞迴實現全排列

2021-10-23 18:01:09 字數 911 閱讀 3434

要求:使用非遞迴的方法按照字典序輸出全排列

思路:這次以「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。第二天早上在地鐵上,在手機撥號頁面演示了一會,竟然有了思路。假定 從小打大排序,稱為正序,反之稱為逆序,我的思路是 以...