考虑集合S={x1,x2,x3,....,xn}
求S的全排列perm(S)
perm(S)=sum xi#perm(s-xi) 这里的#表示将xi置于全排列的perm(s-xi)的前面
也就是说S的全排列等价于去掉其中某个元素的全排列拼接这个元素的所有情况的和。
写成C++代码如下
void doPerm(int a[], int i, int len)
{
if(i>=len-1)
{
for(int i=0;i
cout<<<" ";
cout<
return;
}
for(int j=i;j
{
swap(a[j],a[i]); //将某个元素交换到前面,然后对后面元素球全排列
doPerm(a,i+1,len);
swap(a[j],a[i]); //此处一定要交换回来,否则结果就乱掉了
}
}
复杂度就等于全排列的复杂度n!
调用方式: doPerm(a,0, n); n为数组a的长度。