c語言的全排列

在c語言中實現全排列,對於剛接觸c語言,還沒學習算法的人來說,比較困難了吧。估計大佬也不會看這種基礎的東西,全排列實現的辦法很多,在c++中有一個專門的函數可以使用,但是在c中實現就有點困難了。如果你想出用一個循環使一個數字每一位都不相同,那麼你就走進了死衚衕,這種辦法運算量巨大,往往到了高位就會超時。所以就要使用算法(非遞歸類型)。
算法採用的是交換
遞歸其實也是一種交換

#include<stdio.h>
#include<windows.h>
int main()
{
int a[9],n,y=1,i,j,all,p=1,t,hi,ki,m,x;
int xiao_biao,temp,zhong;
printf("請輸入位數最高9位\n");
scanf("%d",&n); 


for( i=0;i<n;i++){
a[i]=i+1;
printf("%d",a[i]);
}
printf("\n");
for(i=1;i<=n;i++){
p*=i;
}
all=1;
while(all<p){
for(i=n-1;i>0;i--){
if(a[i]>a[i-1]){xiao_biao=i-1;break;}
}
temp=a[xiao_biao];
for(t=xiao_biao+1;t<n;t++){
for(i=t;i<n;i++){
hi=a[t]-temp;
ki=a[i]-temp;
if(hi<=ki&&hi>0){
a[xiao_biao]=a[t];y=t;
}
}
}
a[y]=temp;
m=((n-1)-(xiao_biao))/2;
j=xiao_biao+1;
if((n-1)-(xiao_biao)==2){temp=a[n-1];a[n-1]=a[n-2];a[n-2]=temp;}
else if((n-1)-(xiao_biao)==3){temp=a[n-1];a[n-1]=a[n-3];a[n-3]=temp;}
else if((n-1)-(xiao_biao)==4||(n-1)-(xiao_biao)==5)x=2;
else if((n-1)-(xiao_biao)==6||(n-1)-(xiao_biao)==7)x=3;
else if((n-1)-(xiao_biao)==8||(n-1)-(xiao_biao)==9)x=4;
if((n-1)-(xiao_biao)==4||(n-1)-(xiao_biao)==5||(n-1)-(xiao_biao)==6||(n-1)-(xiao_biao)==7||(n-1)-(xiao_biao)==8||(n-1)-(xiao_biao)==9){ 
zhong=n;
for(i=0;i<x;i++){

    temp=a[zhong-1];
a[zhong-1]=a[j];
a[j]=temp;
zhong--;
j++;
}
zhong=n;
}

for( i=0;i<n;i++){
printf("%d",a[i]);
}

printf("\n");
all++; 
}
system("pause");
return 0;

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章