用HeapPermute方法生成全排列
1.原始算法
v的1~N位元素为初始待排列的元素,整个v从0到N,共N+1个元素
运行函数后,s保存1~N的全排列序列
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> s;
vector<int> v;
void HeapPermute(int n)
{
int tmp;
if(n == 1)
{
s.push_back(vector<int>(v.begin() + 1, v.end()));
}
else
{
for(int i = 1; i <= n; ++i)
{
HeapPermute(n - 1);
if(n % 2 == 1)
{
tmp = v[1];
v[1] = v[n];
v[n] = tmp;
}
else
{
tmp = v[i];
v[i] = v[n];
v[n] = tmp;
}
}
}
}
int main(int argc, const char * argv[])
{
int N = 5;
for(int i = 0; i <= N; ++i)
{
v.push_back(i);
}
HeapPermute(N);
for(auto k : s)
{
for(auto i : k)
{
cout << i << ' ';
}
cout << endl;
}
return 0;
}
2.对算法细节进行改进
v为初始待排列的元素,从1到N,共N个元素
运行函数后,s保存1~N的全排列序列
函数HeapPermute(N)的输入N为待排元素的个数
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> s;
vector<int> v;
void HeapPermute(int n)
{
int tmp;
if(n == 0)
{
s.push_back(v);
}
else
{
for(int i = 0; i < n; ++i)
{
HeapPermute(n - 1);
if(n % 2 == 0)
{
tmp = v[0];
v[0] = v[n-1];
v[n-1] = tmp;
}
else
{
tmp = v[i];
v[i] = v[n-1];
v[n-1] = tmp;
}
}
}
}
int main(int argc, const char * argv[])
{
int N = 5;
for(int i = 1; i <= N; ++i)
{
v.push_back(i);
}
HeapPermute(N);
for(auto k : s)
{
for(auto i : k)
{
cout << i << ' ';
}
cout << endl;
}
return 0;
}
3.用改进后的算法对ABC进行全排列
#include <iostream>
#include <vector>
using namespace std;
vector<vector<char>> s;
vector<char> v;
void HeapPermute(int n)
{
int tmp;
if(n == 0)
{
s.push_back(v);
}
else
{
for(int i = 0; i < n; ++i)
{
HeapPermute(n - 1);
if(n % 2 == 0)
{
tmp = v[0];
v[0] = v[n-1];
v[n-1] = tmp;
}
else
{
tmp = v[i];
v[i] = v[n-1];
v[n-1] = tmp;
}
}
}
}
int main(int argc, const char * argv[])
{
v = {'A', 'B', 'C'};
HeapPermute(3);
for(auto k : s)
{
for(auto i : k)
{
cout << i << ' ';
}
cout << endl;
}
return 0;
}
输出:
A B C
B A C
C B A
B C A
C A B
A C B