如何在JavaScript中實現歸併排序?
歸併排序
歸併排序演算法,我們可以按特定順序對元素進行排序。該演算法也被認為是分治策略的一個例子。在歸併排序演算法中,首先將陣列分成兩部分,然後以特定排序的方式組合。
陣列將被分成兩半,直到無法再分割。這意味著如果陣列完全分割並且無法進一步分割,則停止分割。我們將陣列分成兩半,並在每一半上實現歸併排序。該演算法是一個將兩個較小的分割陣列組合成較大的陣列的過程。
輸入輸出場景
考慮一個數組,其中包含一些未排序的隨機順序的元素,我們可以透過執行歸併排序來對這些元素進行排序。讓我們檢查下面的場景。
Input = [12, 34, 11, 1, 54, 25, 67, 45]; Output = 1, 11, 12, 25, 34, 45, 54, 67
正如我們在輸出中看到的,元素已經按升序排序。
歸併排序是如何工作的?
要了解歸併排序的工作方式,讓我們假設一個數組arr= [30, 20, 40, 0, 10, 80, 11]。
首先,我們需要檢查陣列的左索引是否小於陣列的右索引,如果陣列滿足條件,則計算陣列的中點。

現在我們需要將包含 7 個元素的陣列分成兩個大小分別為 4 和 3 的陣列。
將陣列分成兩半後,它將如下所示。

將陣列繼續分成兩半,直到陣列不能再分割。

將所有元素分成最小單元后,現在根據元素的大小比較元素。
首先比較每個列表中陣列的元素,然後對其進行排序並將其合併到另一個列表中。

執行所有合併後,將得到以下列表。

演算法
讓我們看看演算法:
宣告一個數組、左索引、右索引和中間變數。
執行歸併排序。
mergesort(array, left index, right index)
如果左索引 > 右索引
返回
mid= (左索引 + 右索引) / 2
mergesort(array, 左索引, mid) // 上半部分
mergesort(array, mid+1, 右索引) // 下半部分
merge(array, 左索引, mid, 右索引) // 合併上述步驟中排序的兩半
示例
在下面的示例中,為了執行歸併排序,我們建立了一個包含隨機順序元素的陣列。並使用歸併排序演算法將陣列元素按升序排序。
<!DOCTYPE html> <html> <title>Merge Sort</title> <head> <script> function merge_Arrays(left_sub_array, right_sub_array) { let array = [] while (left_sub_array.length && right_sub_array.length) { if (left_sub_array[0] < right_sub_array[0]) { array.push(left_sub_array.shift()) } else { array.push(right_sub_array.shift()) } } return [ ...array, ...left_sub_array, ...right_sub_array ] } function merge_sort(unsorted_Array) { const middle_index = unsorted_Array.length / 2 if(unsorted_Array.length < 2) { return unsorted_Array } const left_sub_array = unsorted_Array.splice(0, middle_index) return merge_Arrays(merge_sort(left_sub_array),merge_sort(unsorted_Array)) } unsorted_Array = [39, 28, 44, 4, 10, 83, 11]; document.write("The sorted array will be: ",merge_sort(unsorted_Array)); </script> </head> <body> </body> </html>
注意
與其他排序演算法相比,歸併排序演算法的執行速度較慢。
即使陣列已排序,它也會遍歷整個排序過程。
此演算法還需要 0(n) 的額外記憶體空間用於臨時陣列。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP