之前实现的permutation一直是用数组(或者vector之类)的容器,然后递归出来的。面对要求快速求出next permutation的问题束手无策,今天看了STL中next_permution的实现,自己在没有看源码写一点吧。
#include <iostream>
#include <vector>
#include <string>
/* 算法的主要思想
以数组 0 1 2 4 3 为例
1. 从最末元素开始往前查找,找到第一对元素(第一个即为i,第二记为ii),
使*i < *ii,在本例为元素对 2 4
2. 从尾部开始往前查找,找出第一个大于i元素的值,记为j,此处为3
3. 然后交换i和j的元素,再将ii后的元素(含ii)逆置,即可得next permutaioin
例子的结果为 0 1 3 2 4
*/
template <typename T>
bool next_permutation (typename std::vector<T>::iterator first, typename std::vector<T>::iterator last)
{
typename std::vector<T>::iterator i, ii, j;
// 1. find the last pair of i and ii, let *i < *ii
ii = last - 1;
if (ii == first || first == last) // only 1 element or empty, done
return false;
i =