合併排序 C 實現

2021-07-08 14:36:44 字數 744 閱讀 5404

寫給自己的,避免忘記!!
合併排序演算法採用先分治,再合併的思路。此思路根據演算法導論原理,在合併演算法中,是將兩個已經排序好的陣列進行合併。

我的演算法是可以對任意可變陣列進行排序,對於待合併的陣列元素為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...