運用了圖的遍歷演算法:dfs深度優先遍歷
中心思想:
設r=是要進行排列的n個元素,ri=r-.
perm(x)表示在全排列perm(x)的每乙個排列前加上字首ri得到的排列。
(1)當n=1時,perm(r)=(r),其中r是集合r中唯一的元素;
(2)當n>1時,perm(r)可由(r1)+perm(r1),(r2)+perm(r2),…,(rn)+perm(rn)構成。
那麼具體程式要怎麼實現呢?我們來個實際的例子,假設有一數列1,2,3,4
那麼1,2,3,4的全排列
perm()=1perm()+2perm()+3perm()+4perm(1,2,3)
那麼我們只要將每個數,與第乙個數交換不就可以得到下乙個序列了嗎?
比如第乙個與第二個數交換,那麼不就得到2 了,接下來我們用乙個實際的例子說明該程式是怎樣執行的
具體演算法流程:
數列: 第乙個與第乙個交換
可以得到1 將序列放進perm函式遞迴,然後
——遞迴
數列第乙個與第乙個交換
得到2 ,輸出1,2,3 (此時low=high,因為序列只有一位數,因此輸出列表list)
數列第乙個與第乙個交換回來,結果仍然是
數列第乙個與第二個交換
得到3,輸出1,3,2
又第乙個與第二個交換回來,變回
—–遞迴完畢序列恢復原狀
數列: 第乙個與第二個交換
可以得到2,
——遞迴
數列第乙個與第乙個交換
得到1 ,輸出2,1,3
數列第乙個與第乙個交換回來,結果仍然是
數列第乙個與第二個交換
得到3,輸出2,3,1
又第乙個與第二個交換回來,變回
—–遞迴完畢
序列第乙個與第二個交換
序列恢復原狀
數列: 第乙個與第三個交換
可以得到3,
——遞迴
數列第乙個與第乙個交換
得到1 ,輸出3,1,2
數列第乙個與第乙個交換回來,結果仍然是
數列第乙個與第二個交換
得到2,輸出3,2,1
又第乙個與第二個交換回來,變回
—–遞迴完畢
序列第乙個與第二個交換
序列恢復原狀
演算法可以簡單地寫作
perm()=1perm()+2perm()+3perm()
perm()=2perm()+3perm()
perm()=1perm()+3perm()
perm()=1perm()+2perm()
c++**:
#include
using namespace std;
void swap(int &a,int &b)
void perm(int list,int low,int high);
perm(list,0,2);
return 0;
}程式結果:
123132
213231
321312
遞迴輸出全排列
輸入整數n n 0,10 按字典序輸出1 n的全排列。解法是暴力排序,核心思想在於依次確定每位數字,確定每位數字的方法相同,故可使用遞迴。每位數字均是從1開始檢驗,確定了一位後進行標記,遞迴進入下一位的確定,遇到已經標記的數字則跳過。字典序的完成 順序的檢查帶來了順序的排列。step記載了每一位上的...
全排列遞迴演算法
全排列是將一組數按一定順序進行排列,如果這組數有n個,那麼全排列數為n 個。現以為 例說明如何編寫全排列的遞迴演算法。1 首先看最後兩個數4,5。它們的全排列為4 5和5 4,即以4開頭的5的全排列和以5開頭的4的全排列。由於乙個數的全排列就是其本身,從而得到以上結果。2 再看後三個數3,4,5。它...
全排列(遞迴演算法)
一 全排列演算法 從n個不同元素中任取m m n 個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的乙個排列。當m n時所有的排列情況叫全排列。公式 全排列數f n n 定義0 1 演算法 遞迴演算法 網路上偷了乙個圖 全排列 順便複習乙個數學公式 排列的定義 從n個不同元素中,任取...