首页 > 代码库 > C语言实现全排列

C语言实现全排列

实现全排列,递归实现

 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      else23      {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 }