实现全排列,递归实现
1 #include <stdio.h> 2 #include <stdlib.h> 3 int n=0; 4 5 void swap(int *a, int *b) 6 { 7 int m; 8 m=*a; 9 *a=*b; 10 *b=m; 11 } 12 void perm(int list[], int k, int m) 13 { 14 int i; 15 if(k==m) 16 { 17 for(i=0;i<=m;i++) 18 printf("%d ",list[i]); 19 printf("\n"); 20 n++; 21 } 22 else 23 { 24 for(i=k;i<=m;i++) 25 { 26 swap(&list[k],&list[i]); 27 perm(list, k+1, m); 28 swap(&list[k], &list[i]); 29 } 30 } 31 } 32 int main(void) 33 { 34 int list[]={1,2,3,4,5,6,7}; 35 perm(list,0,6); 36 printf("total:%d\n",n); 37 system("pause"); 38 return 0; 39 }
求字典顺序的下一个全排列
1 #include <stdio.h> 2 #include <stdlib.h> 3 void swap(int *a, int *b) 4 { 5 int m; 6 m=*a; 7 *a=*b; 8 *b=m; 9 } 10 void perm(int list[], int len) 11 { 12 int i=0; 13 int k=0; 14 int n=len; 15 int j=1; 16 for(;j<=len;j++) 17 { 18 if(list[j-1]<list[j]) 19 i=j; 20 } 21 for(j=1;j<=len;j++) 22 { 23 if(list[i-1]<list[j]) 24 k=j; 25 } 26 swap(&list[i-1],&list[k]); 27 for(j=0;j<=i;j++) 28 { 29 printf("%d ",list[j]); 30 } 31 for(j=len;j>i;j--) 32 { 33 printf("%d ",list[j]); 34 } 35 } 36 int main(void) 37 { 38 int list[]={7,6,4,1,3,5,2}; 39 perm(list,6); 40 system("pause"); 41 return 0; 42 }