C语言实现全排列
全排列的定义:从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列
全排列的递归可以尝试自己画一下特别有帮助对研究递归嵌套,反正就是特别难
在书上说:设R={r1,r2,....,rn}是要进行排列的n个元素,Ri=R-{ri}。集合X中元素的全排列记为Perm(X)。(ri)Perm(X)表示在全排列Perm(X)的每一个排列前加上前缀ri得到的排列。
R的全排列可归纳定义如下:
在N=1时,Perm(R)=(r),其中r是集合R中唯一的元素;
当N>1时,Perm(R)由(r1)Perm(R1),(r2)Perm(R2)等构成
依次递归定义,可设计产生Perm(R)的递归算法
void permutation(int k, int n, int a[])
{
//递归到底层
if(k == n-1)
{
for(int i = 0; i < n; i ++)
printf("%d-", a[i]);
printf("\n");
}
else
{
for(int i = k; i < n; i ++)
{
int temp = a[k];
a[k] = a[i];
a[i] = temp;
//交换后递归下一层
permutation(k+1, n, a);
//保证每一层递归后保持上一层的顺序
temp = a[k];
a[k] = a[i];
a[i] = temp;
}
}
}
源码为
#include <stdio.h>
void permutation(int k, int n, int a[])
{
//递归到底层
if(k == n-1)
{
for(int i = 0; i < n; i ++)
printf("%d-", a[i]);
printf("\n");
}
else
{
for(int i = k; i < n; i ++)
{
int temp = a[k];
a[k] = a[i];
a[i] = temp;
//交换后递归下一层
permutation(k+1, n, a);
//保证每一层递归后保持上一层的顺序
temp = a[k];
a[k] = a[i];
a[i] = temp;
}
}
}
int main()
{
int a[100];
int n,k;
printf("取n个不同的元素,n为:");
scanf_s("%d", &n);
printf("元素为(元素不能重复):");
for(int i = 0; i < n; i ++)
{
scanf_s("%d",&k);
a[i] = k;
}
permutation(0, n, a);
int ll;
scanf_s("%d",&ll);
return 0;
}