求一串数字的全排列,采用递归算法。
看下列关键代码。其中函数形参中 k 代表从数组下标几开始,
m代表数组最后一个元素的索引值。
当 k == m 时 输出此次排列。
例如我们求 1,2,3的全排列,传入此函数中。
进入第一次循环,此时 i = 0,k =0; swap两个数据,因为索引相同所以相当于第一次循环的时候没有交换。紧接着进入标号②,perm(list,k+1,m), 此时传入perm的 k 为1不等于2不输出,再次进入循环中,此时 i = k =1 索引同样相同,值依旧没变。紧接着再次进入perm(list,k+1,m),
此时 k == m 输出此排列后,第一次递归结,;返回到 k == 1 时循环中进行标号③步骤,但此时i = k =1 依旧值没变,进入下一次循环,此时 k = 1,i = 2,swap 交换后 得到 1,3,2的排列,然后又进入递归,perm(list,k+1,m),此时 k == m ==2,输出此排列。然后递归结束返回到步骤③,将交换的排列改回来,得到1,2,3。递归结束返回到 k =0时的步骤③中,进行循环,此时i也等于0,索引相同值不变。第二次循环,交换了 1 和 2 得到排列 2,1,3后进入步骤②中 k == i==1交换值不变,再次进入步骤②后k==m==2 直接输出。再次反复即可得到 1,2,3的全排列。
void perm(int list[],int k,int m){
if(k==m){
for(int i=0;i<=m;i++){
cout<<list[i];
}
cout<<endl;
}
else{
for(int i=k;i<=m;i++){
Swap(list[k],list[i]); //1
perm(list,k+1,m); //2
Swap(list[k],list[i]); //3
}
}
}
#include<iostream>
using namespace std;
inline void Swap(int &a,int &b){
int t = a;
a =b;
b=t;
}
void perm(int list[],int k,int m){
if(k==m){
for(int i=0;i<=m;i++){
cout<<list[i];
}
cout<<endl;
}
else{
for(int i=k;i<=m;i++){
Swap(list[k],list[i]);
perm(list,k+1,m);
Swap(list[k],list[i]);
}
}
}
int main()
{
int a[] = {1,2,3};
perm(a,0,2);
return 0;
}
以上是全排列代码。