原理解释:
用递归求全排列的思路,设定数字为{5,8,2}
1.让第一个数不同,得到三个数列,其办法是把第一个数和后面的每个数交换
5 8 2 //把第一个数和第一个交换
8 5 2 //把第一个数和第二个交换
2 8 5 //把第一个数和第三个交换
以上三个数列,只要第一个数不同,不管后面的n-1个数是怎么排列的,这n个数列都不同。
这是递归的第一层。
2.继续:在上面的每个数列中去掉第一个数,对后面的剩下的数进行类似的排列。
以5 8 2举例
去掉5,对8 2进行排列
8 2
2 8
这是递归的第二层。
重复上述步骤,直到用完所有数字。
数列总个数为个数的阶乘:3!=6
5 8 2
5 2 8
8 5 2
8 2 5
2 8 5
2 5 8
排列总个数:6
下面是代码:
#include <stdio.h>
#include <stdlib.h>
#define Swap(a,b) {int temp = a;a = b;b = temp;}
void quanpailie(int begin,int end,int* num,int data[]);
int main(void)
{
int data[3] = {5,8,2}; //用来全排列的数组
int num = 0; //用来统计全排列的个数
quanpailie(0,2,&num,data); //data数组下标 0-2 数组的起点和终点 num用来统计个数
printf("排列总个数:%d",num);
return 0;
}
void quanpailie(int begin,int end,int* num,int sz[])
{
int i;
if(begin == end) //递归结束条件
{
(*num)++;
printf("%d %d %d\n",sz[0],sz[1],sz[2]); //打印全排列结果看一看
}
else{
for(i = begin;i <= end;i++)
{
Swap(sz[begin],sz[i]); //把当前第一个数与后面所有的数交换
quanpailie(begin+1,end,num,sz);
Swap(sz[begin],sz[i]); //恢复用于下一次交换
}
}
}