將排序陣列拆分成若干個子陣列, 然後進行合併
space ~ o(n)
對所有元素進行插入排序
對所有元素執行 array.sort ---不在演算法考量內
運用分治策略,拆分成兩部分進行合併
假設現有陣列[11,33,55,22,44]
**分析(尋找迴圈不變式)aa1
a2k=a回寫位置,i=a1,j=a2
[11,33,55,22,44]
[11,33,55,infinity]
[22,44,infinity]
k=0; i=0; j=0
[11,33,55,22,44]
[11,33,55,infinity]
[22,44,infinity]
k=1; i=1; j=0
[11,22,55,22,44]
[11,33,55,infinity]
[22,44,infinity]
k=2; i=1; j=1
[11,22,33,22,44]
[11,33,55,infinity]
[22,44,infinity]
k=3; i=2; j=1
[11,22,33,44,44]
[11,33,55,infinity]
[22,44,infinity]
k=4; i=2; j=2
[11,22,33,44,55]
[11,33,55,infinity]
[22,44,infinity]
k=5; i=3; j=2
a1,a2分別新增infinity 無窮大,是個哨兵位置,保證最後乙個可比較回寫的值必定比另乙個區域的最後乙個值小,當a中k指向的回寫位置超出陣列位置,終止迴圈.
**實現合併兩個有序陣列
function merge(a, l, p, r)
}function mergesort(a, l, r) //如果長度小於2即只有乙個或零個長度 本身有序不用排序
const p = math.ceil((l+r)/2); //獲取乙個中心位置進行拆分
mergesort(a, l, p) //左半部分持續拆分
mergesort(a, p, r) //右半部分持續拆分
merge(a, l, p, r) //拆分完成進行合併
}
合併排序演算法
陣列ary的m個元素,ary p ary q ary q 1 ary r 已按曾序排序 使得ary p ary r 按曾序排列 void clibrary merge int ary,int p,int q,int r,int m else k 0 for i p i r i ary i bp k ...
合併排序演算法
主要思想 不斷將已經有序的子陣列a p.q 和a q 1.r 合併為新的有序的陣列a p.r 具體過程可如下操作 分解 將n個元素分成各含n 2個元素的子串行 解決 對兩個子陣列遞迴地排序 合併 合併兩個已經有序的子陣列得到最終的有序陣列。合併 歸併排序 分治策略 include include u...
合併排序演算法
合併排序是用分治策略實現的排序演算法之一。基本思想是 將待排序的元素分成大小大致相同的兩個子集合,分別對這兩個子集合進行排序,最後將排好序的子集合合併成所需要的集合。此方法的時間複雜度t n o nlogn 這種排序方法漸進最優演算法。合併排序 遞迴 include using namespace ...