我们从C++参考上找到一个可能的实现。http://zh.cppreference.com/w/cpp/algorithm/next_permutation
template<class BidirIt>
bool next_permutation(BidirIt first, BidirIt last)
{
if (first == last) return false;//空的数组
BidirIt i = last;
if (first == --i) return false;//只有一个元素
while (true) {
BidirIt i1, i2;
i1 = i;//让i1指向尾部,i作为游标向前走
if (*--i < *i1) {//从后往前看,如果是升序,进入下一循环(需要先检查是不是到头)
i2 = last;//进入循环,也就是说明找到了降序值,例子里的2<7。现在i就是2的iter
while (!(*i < *--i2))//从后向前找到第一个大于2的数
;
std::iter_swap(i, i2);//交换。即2,3
std::reverse(i1, last);//再逆序
return true;
}
if (i == first) {
std::reverse(first, last);
return false;
}
}
}
这是什么意思呢?对于数组1,2,7,4,3,1
下一个排列为:1,3,1,2,4,7
从末尾往前看,数字逐渐变大,到了2时才减小的,然后我们再从后往前找第一个比2大的数字,是3,那么我们交换2和3,再把此时3后面的所有数字转置一下即可,步骤如下:
1 2 7 4 3 1
1 2 7 4 3 1
1 3 7 4 2 1
1 3 1 2 4 7