C++標準庫算法 next_permutation

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章