全排列演算法

2021-06-28 21:19:36 字數 2545 閱讀 6233

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(intn,int *a,int cur)

if(cur==n) //遞迴邊界

for(int i=0; icoutfor(int i=1; i<=n; i++)  //在a[cur] 中填各種整數i

int ok=1;

for(int j=0; jif(a[j]==i)  //如果i已經在a[0]-a[cur-1]中出現過,則不能再選

ok=0;

if(ok)

a[cur]=i;

print(n,a,cur+1); //遞迴呼叫

執行結果:

1 22 1

1 2 3

1 3 2

2 1 3

2 3 1

3 1 2

3 2 1

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

2.       輸入陣列p,並按字典序輸出陣列p的全排列.

示例程式:

#include

#include

using namespacestd;

void print(intn,int *p,int *a,int cur);

int main()

int a[30];

int p[30];

int num,i=0;

while(cin>>num)

p[i++]=num;

sort(p,p+i);

print(i,p,a,0);

return 0;

void print(intn,int *p,int *a,int cur)

if(cur==n) //遞迴邊界

for(int i=0; icout我們列舉的下標i應該不重複、不遺漏的取遍所有p[i]的值,由於p陣列已經排過序,所以只需要檢查p的第乙個元素(!i)與所有「與前面乙個元素不相同」的元素(p[i]!=p[i-1])

for(int i=0; iif(!i||p[i]!=p[i-1])//放在for迴圈的外部

int c1=0,c2=0;

for(int j=0; jif(a[j]==p[i])

c1++;//統計a[0]-a[cur-1]中p[i]的出現次數c1

for(int j=0; jif(p[i]==p[j])

c2++;//統計p陣列中p[i]的出現次數c2

if(c1a[cur]=p[i];

print(n,p,a,cur+1);

示例輸入:

1 1 1 3

^z示例輸出:

1 1 1 3

1 1 3 1

1 3 1 1

3 1 1 1

3.       使用stl的函式

示例程式:

#include

#include

using namespacestd;

int main()

int p[30];

int num,i=0;

while(cin>>num)

p[i++]=num;

sort(p,p+i);

dofor(int j=0;jcoutreturn 0;

示例輸入:

3 4 2 1

^z示例輸出:

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

演算法 全排列

從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.字典序全排列演算法 對給定的字符集中的字元規定了乙個先後關係,在此基礎上規定兩個全排列的先後是從左到...

全排列演算法

標籤 空格分隔 oj 演算法 全排列在很多程式都有應用,是乙個很常見的演算法,常規的演算法是一種遞迴的演算法,這種演算法的得到基於以下的分析思路。給定乙個具有n個元素的集合 n 1 要求輸出這個集合中元素的所有可能的排列。例如,如果集合是,那麼這個集合中元素的所有排列是,顯然,給定n個元素共有n 種...