版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yongwenn163/article/details/79303201
参考http://blog.csdn.net/axiqia/article/details/50967863
(一)递归的全排列算法
(A、B、C、D)的全排列为
1、A后面跟(B、C、D)的全排列
2、B后面跟(A、C、D)的全排列(A与B交换,其他次序保持不变)
3、C后面跟(B、A、D)的全排列(A与C交换,其他次序保持不变)
4、D后面跟(B、C、A)的全排列(A与D交换,其他次序保持不变)
用数字举例方便点:
1234
1243
1324
1342
1432
1423
2134
….
3214
3214
3241
3124
3142
3412
3421
4231
为观察规律,仅仅标红1234全排列中最高位首次1,2,3,4的排列。
解释:
以1234为基础(代码中第二次交换的意义),同为第一层递归的4种状态分别为:
第一位和第一位交换(1234==》1234);
第一位和第二位交换(1234==》2134);
第一位和第三位交换(1234==》3214);
第一位和第四位交换(1234==》4123)。
为保证普遍性,选第三种状态继续递归:
以3214为基础,同为第二层递归的三种状态分别为:
第二位和第二位交换(3214==》3214);
第二位和第三位交换(3214==》3124);
第二位和第四位交换(3214==》3412)。
继续递归即可。
代码:
#include <stdio.h>
#define COUNT 5
int quanpailie(int k,int buf[],int N);
int dicheng(int count)
{
int cnt,result=1;
for(cnt=count;cnt!=0;cnt--)
result=result*cnt;
return result;
}
int main(int argc, char** argv) {
int i;
int data[COUNT];
// printf("Hello world!\n");
//printf("please input N:\n");
//scanf("%d",&N);
printf("there are %d situations:\n",dicheng(COUNT));
for(i=0;i<COUNT;i++)
{
data[i] = i+1;
}
quanpailie(0,data,COUNT);
//printf("N is %d\n",N);
return 0;
}
int quanpailie(int k,int buf[],int N)
{
int i;
if(k == N-1)
{
for(i=0;i<N;i++)
{
printf("%d ",buf[i]);
}
printf("\n");
}
else
{
for(i=k;i<N;i++)
{
int temp=buf[k];
buf[k]=buf[i];
buf[i]=temp;
quanpailie(k+1,buf,N);
temp=buf[k];
buf[k]=buf[i];
buf[i]=temp;
}
}
}