最近研究排列组合,加强数学功底,顺便用stl写了一个生成n个元素全排列的算法。
因为n各元素的集合排列的个数很大(n的阶乘),为了使计算机上有效的运行,算法那每一步的执行必须简单。算法的结果应该是一张表,该表包含n个元素的每一个排列。下面描述的算法具有这些特性,这个算法由Johnson和Trotter独立的发现,并被Gardner在一篇通俗的论文中做了描述。-------摘自《组合数学》
算法基于以下的事实:
在n个元素的一个全排列中删除编号为n的元素,得到的必然按是一个n-1个元素的全排列。
因此,在n-1个元素的全排列中添加元素n,必然能得到一个n个元素的一个全排列。
更一般地,n-1个元素全排列的种类是n-1的阶乘,而n种元素的全排列为n的阶乘,即n*(n-1)!,正好又应对了在n-1个元素全排列中添加元素n有n种方法。
所以算法较为通俗的描述如下:
首先,
1
然后在1的前后插入2
1 2
2 1
然后在能插入的地方插空插入3
1 2 3
1 3 2
3 1 2
2 1 3
2 3 1
3 2 1
通过这种规则不断迭代直到生成n个元素的全排列。
用C++实现这个算法的代码如下(使用了STL):
vector<list<int>> genpermutation(int n)
{
vector<list<int>> result;
l