全排列演算法

2021-08-27 04:02:14 字數 1124 閱讀 5725

一、遞迴法

引用:

比如,假設集合是,那麼這個集合中元素的全部排列是,顯然,給定n個元素共同擁有n!種不同的排列,假設給定集合是,能夠用以下給出的簡單演算法產生其全部排列,即集合(a,b,c,d)的全部排列有以下的排列組成:

(1)以a開頭後面跟著(b,c,d)的排列

(2)以b開頭後面跟著(a,c,d)的排列

(3)以c開頭後面跟著(a,b,d)的排列

(4)以d開頭後面跟著(a,b,c)的排列,這顯然是一種遞迴的思路,於是我們得到了下面的實現:

#include#includeusing namespace std;

re_comb(string a,int k,int len)//k表示當前遞迴第乙個數的位置

(右邊的數從右至左是遞增的,因此k是所有大於pj的數字中序號最大者)  

3)對換pi,pk   

4)再將pj+1......pk-1pkpk+1......pn倒轉得到排列p'=p1p2.....pj-1pjpn.....pk+1pkpk-1.....pj+1,這就是排列p的下乙個排列。

上面解釋的相當清楚,這裡稍微提一些點

1、為什麼要從右向左查詢?  因為這樣能確保變化最小,即找到的數僅比現在的數大一丟丟。

2、為什麼是找到第乙個比右邊小的數?因為這確保說明還有更大的數。

3、為什麼要再從右向左找,找第乙個比其大的數?  因為從左到右是逐漸增加,第乙個比起大,互換後,增加最少(一丟丟)

4、上面引用的第四步,為什麼要倒轉,互換?   因為從左到右是逐漸增加,要只增加一丟丟。

上面在c++的stl庫函式中,為next_permutation(按字典序,找排列組合的下乙個元素)

如果覺得懂了,理解透了。可以嘗試思考一下,prev_permutation(按字典序,找排列組合的上乙個元素)

#include#include#includeusing namespace std;

int main()

{ string s;

getline(cin,s);

sort(s.begin(),s.end());

do {

cout《除了上面的排列方法,常見的排列演算法有:遞增進製數法、遞減進製數法、鄰位對換法

演算法 全排列

從n個不同元素中任取m m n 個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的乙個排列。當m n時所有的排列情況叫全排列。用演算法分別實現全排列,其中n個元素儲存在乙個長度為n的陣列中。實現全排列之前,先看一下對進行全排列的一種方法 從圖中可以看出,我們首先從n個元素中取出乙個元...

全排列演算法

1.遞迴全排列 分別將每個位置交換到最前面位,之後全排列剩下的位。遞迴全排列 1 2 3 4 5 1,for迴圈將每個位置的資料交換到第一位 swap 1,1 5 2,按相同的方式全排列剩餘的位 2.字典序全排列演算法 對給定的字符集中的字元規定了乙個先後關係,在此基礎上規定兩個全排列的先後是從左到...

全排列演算法

1.遞迴生成1 n的全排列 示例程式 include using namespacestd void print intn,int a,int cur int main int num while cin num int a 30 print num,a,0 return 0 void print ...