算法思想:
对于一组数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#includeusing 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;https://www.3tt.net/?mod=artinfo&aid=434cout<<"输入一个n阶全排列:";cin>>n;inserts(1, 1, b);return 0;}
基于此全排列,我们可以间接得到字符串如"abcd"的全排列。