給定壹整數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源碼----------------------------------------