字典排序 ( next_permutation (不是中翻英 = = , 請看程式碼))

if( list[ i-1 ] < list [ i ] )  如果都沒發生,則 list 為大到小排序 (最大了)

那為什麼要找 list[ i-1 ] < list[ i ] 呢?

因為 list[ i ] 之後為大到小,把這些數往前移只會讓整體變得更小而已

因此,如果要找下一個比較大的數

就得將 list[ i-1 ] 換成一個稍稍大的數

多大呢?

就 list[ i ] 之後比他大且最靠近他的數 (姑且稱作 list[ j ] )

因為 list[ i ] 後為大到小,所以我們就從最後面往前找出第一個比他大的數

交換後

list[ i ] 後仍為大到小,但 list[ i ] 前比交換前稍稍大了

但這並不是下一個數,因為 list[ i ] 之後是大到小

因此,我們將 list[ i ] 之後 reverse 變成小到大

則這個數就是我們要找的稍稍大的數  

 

ex:

23651  (下一個數應為 25136 )

list[ i ] = 6

list[ j ] = 5

swap( &list[ i-1 ] , &list[ j ] )

得到 25631

reverse(&list[ i ], &list[ len(list) ] )

得到 25136

 

#include <iostream>
#include <algorithm>

using namespace std;

string next_permutation(string list, const int len)
{
    for (int i=len-1; i>0; i--)
        if (list[i-1] < list[i])
        {
            int j = len-1;
            while (list[i-1] >= list[j]) j--;
            swap(list[i-1], list[j]);
            reverse(&list[i], &list[len]);
            break;
        }

    return list;
}

int main()
{
  string a = "23651";
  string b = next_permutation(a, a.length());

  cout << b << endl;

  return 0;
}

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大神(偽) 的頭像
    大神(偽)

    大神的世界

    大神(偽) 發表在 痞客邦 留言(0) 人氣()