當前位置:成語大全網 - 新華字典 - 枚舉的枚舉排列

枚舉的枚舉排列

給定壹整數n,要按照字典序從小到大的順序枚舉輸出前n個數(1-n)的全排列。例如:n=3時,枚舉排列結果是:(1,2,3)、(1,3,2)、(2,1,3)、(2,3,1)、(3,1,2)、(3,2,1)。以下是c語言源碼實現該算法:

------------------------------------c源碼----------------------------------------

#include<stdio.h>

#include<time.h>

void print_permutation(int n,int *A,int cur){

int i,j;

if(cur==n){

for(i=0;i<n;i++)

printf(%d,A[i]);

printf(\n);

}

else for(i=1;i<=n;i++){

int ok=1;

for(j=0;j<cur;j++){

if(A[j]==i)

ok=0;

}

if(ok){

A[cur]=i;

print_permutation(n,A,cur+1);//遞歸調用

}

}

}

void main(){

int n;

int A[1000];

printf(input the n:);

scanf(%d,&n);

print_permutation(n,A,0);

printf(time used:%.2lf\n,(double)clock()/CLOCKS_PER_SEC);//測試程序運行時間

}

------------------------------------c源碼---------------------------------------- 輸入數組P,並按字典序輸出數組P各元素的全排列到A(註意:P有序),例如P序列為:1 1 2,則對應的排序結果為:(1,1,2)、(1,2,1)、(2,1,1)。以下是該算法的c源碼,P數組長度可以自己調整。

------------------------------------c源碼----------------------------------------

#include<stdio.h>

#include<time.h>

void print_permutation(int n,int *P,int *A,int cur){

int i,j;

if(cur==n){

for(i=0;i<n;i++)

printf(%d,A[i]);

printf(\n);

}

else for(i=0;i<n;i++){

if(!i||P[i]!=P[i-1]){

int c1=0,c2=0;

for(j=0;j<cur;j++){

if(A[j]==P[i])

c1++;

}

for(j=0;j<n;j++){

if(P[i]==P[j])

c2++;

}

if(c1<c2){

A[cur]=P[i];

print_permutation(n,P,A,cur+1);//遞歸調用

}

}

}

}

void main(){

int n,m;

int A[1000];

int P[4];//可以自己修改

int i=0;

while(scanf(%d,&m)==1){

P[i]=m;

i++;

}

n=i;

print_permutation(n,P,A,0);

printf(time used:%.2lf\n,(double)clock()/CLOCKS_PER_SEC);

}

------------------------------------c源碼----------------------------------------