全排序递归算法

时间:2022-10-07 12:05:06

 

给定n(n>=1)个元素的集合,输出该集合的所有可能的排列。

如abc的全排列的个数为3!=6个

分别为:abc,  acb              a开头的bc全排列

    bac,     bca        b开头的ac全排列

    cba,  cab        c开头的ba全排列

递归的线索是后面跟着...的全排列,也就是n个元素的排列问题可以转化为n-1个元素的排列问题

代码如下:

 1 /*
2 递归是从前往后执行,结果从后往前回溯
3 abcd的全排列为 1次
4 a bcd的全排列 a和a换位置之后 转化为求bcd的全排列 求完排列后需要换回来保证初始字符串不变
5 b acd的全排列 a和b换位置之后 转化为求acd的全排列 求完排列后需要换回来保证初始字符串不变
6 c bad的全排列 a和c换位置之后 转化为求bad的全排列 求完排列后需要换回来保证初始字符串不变
7 d bca的全排列 a和d换位置之后 转化为求bca的全排列 求完排列后需要换回来保证初始字符串不变
8 结束条件:当只剩最后一个字母时,他的全排列就是他自己
9 */
10
11 #include<stdio.h>
12 #define SWAP(x,y,t) ((t=x),(x)=(y),(y)=(t))
13 void perm(char *list,int i,int n);
14 int main()
15 {
16 char a[5]="abcd";
17 perm(a,0,3);
18 printf("%s",a);
19 return 0;
20 }
21
22 void perm(char *list,int i,int n)
23 {
24 int j,temp;
25 if(i == n){ //当i是最后一个元素时递归结束
26 for( j = 0; j <= n; j++ )
27 printf("%c",list[j]);
28 printf("\n——————\n");
29 }
30 else{
31 for( j = i ; j <= n ; j++ ){ //求i到n的全排列
32 SWAP(list[i],list[j],temp);//以每一个元素为开始的全排列
33 perm(list,i+1,n); //求i+1到n的全排列
34 SWAP(list[i],list[j],temp);//保证初始数组不变
35 }
36 }
37 }
38
39
40