在刷oj(online judge)題目的過程中,我們經常會遇到一類問題。
題目的描述很簡單的:生成
字典順序)列出,如
迭代解決問題的基本思路是找出初始狀態和通用的形式重複的迭代子過程。對於這個問題,初始狀態已知,即
對於這個問題,我們不必重複造輪子,完全可以利用c++的algorithm library提供next_permutation() 函式,生成當前排列根據給定排序規則而得到的下乙個排列。next_permutation() 函式的原型如下:
template< class bidirit >
bool next_permutation( bidirit first, bidirit last ); // until c++20
template< class bidirit, class compare >
bool next_permutation( bidirit first, bidirit last, compare comp ); // until c++20
以上兩種函式原型定義在 #include 標頭檔案中。
當[first, last)表示的排列存在下乙個排列時,函式返回值會返回true,否則返回false。
需要說明的是,形式參量first和last一般是接受表示迭代器範圍的實際引數,遵循左閉右開原則,last傳入的是初始排列的最後乙個元素的下乙個位置,例如在部分求排列中,對於陣列
int arr = ;
next_permutation(std::begin(arr), std::begin(ar) + 5); 可得到部分陣列的下乙個字典序排列,若想得到整個陣列的字典序排列,呼叫函式的形式應該是next_permutation(std::begin(arr), std::begin(arr) + 6); 或者next_permutation(std::begin(arr), std::end(arr));
可能的實現如下:
templatebool next_permutation(bidirit first, bidirit last)
if (i == first) }}
使用示例如下:
#include #include #include int main()
while(std::next_permutation(s.begin(), s.end()));
}
2. 當然了,重複造輪子在分工明確的標準元件生產環境雖不可取,但是軟體開發這一活動還遠未達到這樣的層次,重複造輪子,了解底層元件的實現原理,往往是程式設計人員內功提公升的必要途徑。
如何按照字典序生成
std中穩定排序演算法 穩定排序演算法
常用排序演算法?穩定性 穩定排序演算法會讓原本有相等鍵值的紀錄維持相對次序。也就是如果乙個排序演算法是穩定的,當有兩個相等鍵值的紀錄r和s,且在原本的列表中r出現在s之前,在排序過的列表中r也將會是在s之前。氣泡排序演算法 比較相鄰的元素,按照順序進行交換,一次遍歷後,就會有乙個最大 最小 交換至頂...
最小生成樹Kruskal演算法 sort排序
struct arcnode int cmp const arcnode x,const arcnode y 從小到大排序 sort myarcnode,myarcnode an,cmp 排序 資料初始化 int vn,an,w 0 int r cin vn an arcnode myarcnode...
sort排序演算法集合
public class sort quicksortarray array 氣泡排序 效率 o n 適用於排序小列表 private static void bubblesortarray int array println array 選擇排序 效率 o n 適用於排序小列表 private s...