全排列算法
1 问题内容
输入:一个集合A,其元素类型为int
输出:A的全排列
2 问题分析
算法设计:
[1]通过输入获得一个数组集合
[2]从数组中依次选择一个数,将其于第一个位置元素交换
[3]通过递归的方式求出,剩下n-1个元素的全排列
[4]回溯,将原本交换后的元素,交换回来
[5]递归出口,当数组中只剩下唯一一个元素时,输出该数组中的元素的排列
3 源代码
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
void perm(int l,int r,int a[]){
int i;
if(l==r)
{
for(i=0; i<=r; i++)
printf("%2d",a[i]);
printf("\n");
}else{
int t;
for(i=l;i<=r;i++){
t=a[i];a[i]=a[l];a[l]=t;
perm(l+1,r,a);
t=a[i];a[i]=a[l];a[l]=t;
}
}
}
int main()
{
int n;
printf("请输入元素的个数,不要超过20\n");
scanf("%d",&n);
int a[MAXSIZE];
int i;
printf("请输入元素\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
printf("元素的全排列是:\n");
perm(0,n-1,a);
return 0;
}