问题描述
设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列
算法思想
设一个集合R={r1,r2,r3,....,rn},当n=1时,可以确定出排列方式perm(R)=r1;集合Ri=R-ri。
所以当n>1时,perm(R)=r1perm(R1)+r2perm(R2)+....+rnperm(Rn)。其中R1,R2,R3......Rn中的元素个数都为n-1。以这种方式不断递归下去直到n=1,既可确定排列方式。
代码如下
Void Perm(Type list[],int k,int m){
if(k==m){
for(int i=0;i<=m;i++){
cout<<list[i];
}
}
else{
for(int i=k;i<=m;i++){
swap(list[k],list[i]); //将第i个数据和k位置互换,以便下一步单拎出来。
perm(list,k+1,m); //通过k+1,来把加之前的k位置的数据单拎出来。
swap(list[k],list[i]); //一种情况结束后还原排列。
}
}
}
inline void Swap(Type &a,Type &b){
Type temp=a;
a=b;
b=temp;
}
算法复杂度
总共有n!种情况所以复杂度为O(n!)。