perm算法即全排列,将一组数据按照一定的顺序将所有的排列组合列出来。
运用了分治法。
思路:
设W={ABC}
perm(W)=A perm({BC}) + B perm({AC}) + C perm({AB})
perm({BC})=B perm({C})+C perm({B})
A perm({BC})=ABperm(C) + A C perm(B)=ABC +ACB。
代码实现:
#include<stdio.h>
#include<string.h>
void swap (char *a , char *b)
{
char p;
p=*a;
*a=*b;
*b=p;
}
void perm(int k,int m,char list[])
//k为前缀位置,m为待排列的个数
{int i;
if(k==m)
{for(i=0;i<=m;i++)
printf("%c",list[i]);
printf("\n");
}
else
for(i=k;i<=m;i++)
{swap(&list[k],&list[i]);
perm(k+1,m,list);
swap(&list[k],&list[i]);
}
}
int main()
{char list[] ="ABC";
perm(0,strlen(list)-1,list);
getchar();
}
运行结果: