算法思想:
对于一组数1,2,3…n;
- 取第一个数1的时候,只有一种排序方法,即1。
- 取第二个数2的时候,有两种排序方法,就是将2插入1的前面或后面,结果是12,21.
- 取第三个数3的时候,有6种排序方法。
- 对于之前已经排好的12,3一共有3个空隙可以插入,结果是312,132,123,
- 对于21也是(321,231,213),所以总共有6种结果。
其他的以此类推…
/*
全排列
*/
#include<iostream>
#include<vector>
using namespace std;
int n;
void print(vector<int> b){
for(auto i:b){
cout<<i<<" ";
}
cout<<endl;
}
void inserts(int k, int num, vector<int> b){
if(b.size()==n){//输出到n阶乘的所有排列
print(b);
return;
}
if(k==1){
b.push_back(num);
inserts(k+1, num+1, b);
}else{
for(int i=0; i<k; i++){
b.insert(b.begin()+i,num);
inserts(k+1, num+1, b);
b.erase(b.begin()+i);
}
}
}
int main(int argc, char const *argv[])
{
vector<int> b;
cout<<"输入一个n阶全排列:";
cin>>n;
inserts(1, 1, b);
return 0;
}
基于此全排列,我们可以间接得到字符串如"abcd"的全排列。