歸併排序(merge-sort)是利用歸併的思想實現的排序方法,該演算法採用經典的分治(divide-and-conquer)策略,
分(divide)成一些小的問題然後遞迴求解,
而治(conquer)的階段則將分的階段得到的各答案"修補"在一起。
**演示gif:
歸併排序演算法我們採用遞迴的方法 先將陣列一直進行折半拆分 拆到長度為一的陣列 再兩兩合併
比如: [5, 6, 3, 1, 8, 7, 2, 4]
1白話思路:. 先將陣列一直進行折半拆分 拆到長度為一的陣列
比如 [
5 ] [ 6 ] [ 3 ] [ 1] 2
. 再拆分的個體進行兩兩合併 用 merge 方法
得到 [
5, 6 ] 和 [ 1, 3
]再將這兩個陣列進行合併 得到
[1, 3 , 5, 6
]這個時候左邊合併完成
進行右邊拆分合併
[ 8 ] [ 7 ] 和 [ 2 ] [ 4
] 得到
[2, 4 , 7 , 8
]所以我們這個時候得到兩個陣列
[1, 3 , 5, 6] 和 [2, 4 , 7 , 8
]對這兩個陣列進行合併 得到最後結果
1,2,3,4,5,6,7,8
先拆分 再合併
先拆分左邊的 拆分到個體為1 的陣列再進行兩兩合併 得到最終結果
接著對右邊進行同樣操作
得到最終結果
這個時候左邊和右邊都得到長度為 n/ 2 的排序好的陣列了
最後一步 將左右兩邊進行merge 重新排序
js 的**實現 歸併排序演算法:
let data = [5, 6, 3, 1, 8, 7, 2, 4]console.log(mergesort(data))
function
mergesort (arr)
let middle = math.floor(len/2);
let left = arr.slice(0, middle)
let right =arr.slice(middle)
return
merge(mergesort(left), mergesort(right))
}function
merge(left, right)
else
}while
(left.length)
result.push(left.shift())
while
(right.length)
result.push(right.shift())
return
result;
}
排序演算法 歸併排序
歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。首先考慮下如何將將二個有序數列合併。這個非常簡單,只要從比較二個數列的第乙個數,誰小就先取誰,取了後就在對應數列中刪除這個數。然後再進行比較,如果有數列為空,那直接將另...
排序演算法 歸併排序
include include define status int define max 20 typedef struct elemtype typedef struct sqlist void inital sqlist l 初始化 bool lt int i,int j void merge ...
排序演算法 歸併排序
歸併排序的思想其實完全是分治法的思想的體現,它完全遵循分治法的模式。這裡有必要再重提下分治法的思想 將原有的問題分解為幾個規模較小的但類似於原問題的子問題,遞迴的求解這些子問題,然後再合併這些子問題的解來求得原問題的解。現在來看看歸併排序的操作 1 將等待排序的含有 n 個元素的序列分解成各具有 n...