// 全排列的递归实现,只有一个元素时,全排列是其自身。增加一个元素时,打印第一个元素,再递归剩下的元素。
//但每个元素都要当一次 "第一个"
#include <stdio.h>
#include <assert.h>
void print(int *p, int n)
{
int i;
for (i=0; i<n; i++)
{
printf("%d ", p[i]);
}
printf("\n");
}
void swap_(int &a, int &b)
{
if (a==b)
{
return;
}
a^=b;
b^=a;
a^=b;
}
void perm(int*a, int nn, int *p, int n)
{
if (n==1)
{
print(a,nn);
return;
}
int i;
for (i=0; i<n; i++)
{
swap_(p[0],p[i]);
perm(a, nn, p+1, n-1);
swap_(p[0],p[i]);
}
}
int main()
{
int a[8]={1,2,3,4,5,6,7,8};
perm(a,3,a,3);
printf("\n");
perm(a,4,a,4);
return 0;
}
注意:使用异或来交换原始时,必须判断两者是否指向同一内存。
这种方法的缺点:
1.递归深度大时,影响效率;
2.未考虑重复元素