JS排序演算法總結 (六)歸併排序

2022-07-18 12:36:12 字數 1105 閱讀 8977

目的:掌握歸併排序基本思想與過程、**實現、時間複雜度

1、基本思想與過程:先遞迴的分解數列再合併數列(分治思想的典型應用)

(1)將乙個陣列拆成a、b兩個小組,兩個小組繼續拆,直到每個小組只有乙個元素為止。

(2)按照拆分過程逐步合併小組,由於各小組初始只有乙個元素,可以看做小組內部是有序的,合併小組可以被看做是合併兩個有序陣列的過程。

(3)對左右兩個小數列重複第二步,直至各區間只有1個數。

下面對陣列【42,20,17,13,28,14,23,15】進行歸併排序,模擬排序過程如下:

第一步:拆分陣列,一共需要拆分三次(logn);

第一次拆成【42,20,17,13】,【28,14,23,15】,

第二次拆成【42,20】,【17,13】,【28,14】,【23,15】,、

第三次拆成,,,,,,,;

第二步:逐步歸併陣列,採用合併兩個有序陣列的方法,每一步其演算法複雜度基本接近於o(n)

第一次歸併為【20,42】,【13,17】,【14,28】,【15,23】

第二次歸併為【13,17,20,42】,【14,15,23,28】,

第三次歸併為【13, 14, 15, 17, 20, 23, 28, 42】

2、**實現:

(1)輔助函式:合併兩個有序陣列的方法 merger(a, b)

function

merger(a, b)

while (i

c.push(a[i++]);

while (j

c.push(b[j++]);

console.log("將陣列",a,'和',b,'合併為',c)

return

c;}

(2)歸併程式為:

3、時間複雜度:o(n*logn)

排序演算法(六) 歸併排序

對於歸併排序,與快速排序一樣,巧妙的應用了分治演算法的核心思想,它將整個序列分成若干組子串行,對這些子串行進行排序後,在一步一步進行合併有序子串行,從而使得整個序列達到有序。但針對於歸併排序,有著兩種不同的排序方式,一是通過整個序列進行著手,將這個序列進行一步一步的劃分,自頂向下進行處理,主要步驟包...

排序演算法 六 歸併排序

歸併排序的基本思想是分治法。先將無序序列分為若干個無序子串行,然後對無序子串行進行排序,最後合併有序子串行,得到完全有序的序列。這就是分解,求解,合併的過程。將待排序序列data 0,1,2 n 1 看成是n個長度為一的序列,將相鄰序列進行合併,得到n 2個長度為2的有序序列 將相鄰序列再次進行合併...

排序演算法(六) 歸併排序

歸併排序 merge sort 又稱二路歸併排序,是指將乙個陣列一分為二,對每乙個子陣列遞迴排序,最後將排好的子陣列合併為乙個有序陣列的過程。歸併排序,是 分治法 應用的完美實現。1.歸併排序圖示 2.歸併排序流程 通過圖示,可以發現歸併排序一共只需要兩個步驟 3.實現 歸併排序的 邏輯還是很容易看...