JavaScript演算法 合併排序 分治策略

2021-09-11 07:54:23 字數 1226 閱讀 7866

將排序陣列拆分成若干個子陣列, 然後進行合併

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 ...