寫給自己的,避免忘記!!
合併排序演算法採用先分治,再合併的思路。此思路根據演算法導論原理,在合併演算法中,是將兩個已經排序好的陣列進行合併。
我的演算法是可以對任意可變陣列進行排序,對於待合併的陣列元素為n,最多比較n次,為實現高效率,避免每次檢查陣列,檢查到最後導致溢位,在每乙個陣列後面加乙個哨兵,哨兵一般取計算機所能達到的最大值,當其中乙個陣列出現哨兵時,說明該陣列已經排序完成,此後另外乙個陣列每次比較時都是與那個哨兵比較,相當於把另外乙個陣列的值直接新增到待合併的陣列中。其**如下:
void insert::merge(vector
& a,vector
& sub1,vector
& sub2)//sub1,sub2為已排好的陣列
else
}}
a為引用,其陣列元素的個數為sub1和sub2的元素個數之和。sub1和sub2都要為引用,不然遞迴後排序會失效。合併演算法**如下:
void insert::mergesort(vector
& coll)//合併排序,先分治法,再合併
insert.mergesort(coll);//合併排序
for(auto pos=coll.begin();pos!=coll.end();++pos)
system("pause");
時間複雜度為o(n*lgn),如有合併排序的更好演算法,敬請賜教,相互交流! 合併排序實現
code include using namespace std 合併兩個有序的子陣列 輸入 整數陣列a,下標p,q,r,元素個數m 其中a p a q 和a q 1 a r 已按遞增順序排序 輸出 按遞增順序排序的子陣列a p a r void merge int a,int p,int q,in...
分治 合併排序 自然合併排序(C )
演算法步驟 引用自 菜鳥教程 申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列 設定兩個指標,最初位置分別為兩個已經排序序列的起始位置 比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置 重複步驟 3 直到某一指標達到序列尾 將另一串行剩下的所有元素直...
筆記 排序演算法 合併排序(C 實現)
nl gn theta nlg n nlgn 空間複雜度 t n t n t n 舉個例子 給陣列a a a 排序 合併排序流程 merge sort a 1 if n 1,done 2 對a和 a a i 1 key return a 定義merge sort函式實現合併排序 input a in...