#include<iostream>
#include<vector>
using namespace std;
vector<vector<int>>ps;//存放子集
void Insert(vector<int>s,int i,vector<vector<int>>&ps1){
vector<int>s1;
vector<int>::iterator it;//在s(含i-1哥整数)的每个位置插入i
for(int j=0;j<i;j++){
s1=s;
it=s1.begin()+j;//求出插入位置,从0开始+j
s1.insert(it,i);//在当前位置插入i
ps1.push_back(s1);//新子集合添加到全排列集合中
}
}//在每个集合元素中插入i得到ps1
void Perm(int n){
vector<vector<int>>ps1;//临时存放全排列集合
vector<vector<int>>::iterator it;
vector<int>s,s1;
s.push_back(1);
ps.push_back(s);//初始化添加第一个元素1
for(int i=2;i<=n;i++){
ps1.clear();//初始化ps1
for(it=ps.begin();it!=ps.end();++it)
Insert(*it,i,ps1);
ps=ps1;
}
}//求出1~n的全排列集合
void Display(){
vector<vector<int>>::reverse_iterator it;//全排列的反向迭代器
vector<int>::iterator sit;
for(it=ps.rbegin();it!=ps.rend();++it){
for(sit=(*it).begin();sit!=(*it).end();++sit)
cout<<*sit;
cout<<'\n';
}
}//输出全排列
int main(){
int n;
cout<<"请输入n值:";
cin>>n;
cout<<"1~"<<n<<"的全排列如下:\n";
Perm(n);
Display();
}
由于是暴力求解,所以时间复杂度很高,为O(n*n!)
-------该算法摘自《算法设计与分析(第2版)》