排列問題:
設R = {r1, r2, ... , rn}是要進行排列的n個元素, Ri = R-{ri}; 集合X中元素的全排列記為Permutation(X), (ri)Permutation(X)表示在全排列Permutation(X)的每個排列前加上前綴ri得到的排列.
R的全排列可歸納定義以下:
當n=1時,Permutation(R)={r},r是集合R中唯1的元素;
當n>1時,Permutation(R)由(r1)Permutation(R1),(r2)Permutation(R2), ..., (rn)Permutation(Rn)構成。
順次遞歸定義,則可設計產生Permutation(X)的遞歸算法以下:
算法說明:
算法Permutation(array, k, m)遞歸地產生所有前綴是array[0:k⑴],且后綴是array[k:m]的全排列的所有排列.函數調用(list, 0, n⑴)則產生list[0:n⑴]的全排列.
算法演示:
char str[] = “abc”;的遞歸調用進程如圖:
小結:
雖然我們自己實現了Permutation, 但C++ STL中也實現了std::next_permutation算法, 在1般利用中, 我比較推薦使用STL中已實現好的next_permutation, 畢竟STL的代碼質量還是非常高的, 而且速度1點也不遜色于我們的實現;
插入排序是低級排序中速度最快的1種(冒泡/選擇/插入排序效力均為O(N^2)),但是跟快速排序(NlogN),歸并排序(NlogN)還是有1定的差距的⊙
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈