我們從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