本文详细介绍用递归算法打印n个数的全排列。
比如n=3,则这三个数“1”、“2”、“3”的全排列有:
123、132、213、231、321、321
算法思想:
1.先将n个元素随便排成一列。
2.采用swap,将第1个位置的元素分别与后面n-1个位置的元素交换,就可以得到第一个位置元素的不同情况。
在每种情况下用递归调用得到第2个位置放不同元素的情况,即将第2个位置的元素与余下n-2个位置元素交换。
在第二个位置放不同元素的情况下,(再次递归调用)将第3个位置与余下n-3个位置元素交换;…………
4.直到当前位置到第n个位置,表示处理结束。k=n也称递归出口。
注意!!每次要交换回去,便于后面的正确处理。
代码实现:
void PrintPermutation(int a[], int k, int n){
if(k == n){
for(int i=1; i<n+1; ++i){
cout << a[i] << " ";
}
cout << endl;
return;
}
else{
for(int i=k; i<n+i; ++i){
Swap(a[k], a[i]);
PrintPermutation(a, k+1, n);
Swap(a[k], a[i]);
}
}
}
性能分析:
T(n)=O(n!)