算法解析 Next Permutation 下一個排列
2023-02-18 19:58 作者:EKVTGwNJiElK | 我要投稿
實現(xiàn)的功能
它能計算比某一個排列大的所有排列中的最小排列。這里的大小指的是字典序,即把排列看成是? 進(jìn)制的
位數(shù)進(jìn)行比較。如果
,將此算法應(yīng)用于?
將得到?
。
代碼分析
這是 glibc 位于頭文件 bits/stl_algo.h 對函數(shù)?std::next_permutation
?的實現(xiàn),這個函數(shù)能對一個序列應(yīng)用此算法。
這一大段代碼用 OIer 的語氣寫,大概就是這樣。其中?swap
?交換兩個變量的值;reverse
?反轉(zhuǎn)排列,兩個參數(shù)分別為起點下標(biāo)和終點下標(biāo)加一。
算法分析
從后往前找到第一個(從前往后最后一個)滿足??的?
,此時第?
?個數(shù)后面的數(shù),組成的子序列遞減,是最大的排列了。所以要想得到更大的排列必須修改?
。接著向后遍歷?
?后比它大的最小的數(shù)?
,把?
?和?
?交換,接著把第
?的數(shù)按從小到大排序就好。因為此時要排序的數(shù)已經(jīng)遞減了,所以能用?
reverse
?在線性時間內(nèi)完成這里的排序。
標(biāo)簽: