前端排序演算法 歸併排序演算法 (1)

2022-06-20 05:48:08 字數 1632 閱讀 9377

歸併排序(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...