歸併排序(Merge sort)

2021-10-04 00:19:49 字數 1250 閱讀 1862

歸併排序是一種遞迴演算法,可以將列表連續分成兩半。 如果列表為空或只有乙個元素,則按定義(基本情況)已是排序列表。 如果列表有多個元素,我們拆分列表並在兩半上遞迴呼叫合併排序。 一旦這兩半部分排序完畢,就會執行稱為合併的基本操作。 合併是獲取兩個較小的排序列表並將它們組合成乙個排序的新列表的過程。

def merge_sort(a_list):

print('splitting ', a_list)

if len(a_list) <= 1:

return a_list

mid = len(a_list) // 2

left = merge_sort(a_list[:mid])

right = merge_sort(a_list[mid:])

return merge(left, right)

def merge(left, right):

l, r = 0, 0

result =

while l < len(left) and r < len(right):

if left[l] < right[r]

l += 1

else:

r += 1

result += left[l:]

result += right[r:]

print('merging', result)

return result

merge_sort方法是乙個遞迴函式,我們將整個列表折半拆分成左右兩個部分,並分別對左右兩個部分進行合併排序操作(遞迴呼叫merge_sort)。然後返回對排序好了的兩個部分進行歸併的結果(merge函式)。merge函式的功能就是將左右兩個子列表歸併成乙個。

歸併排序是一種穩定的排序演算法,原因是折半拆分首先不改變相等元素的相對位置,其次在歸併的時候,我們對大小比較可以進行有效的控制,如merge方法中的if left[l] < right[r]。

歸併排序的演算法時間複雜度分析:首先是折半拆分,由二分查詢演算法可知,若列表長度為n,則需要花費\(\log_2n\)的次數拆分。然後是歸併操作,長度為n的列表需要n次歸併,則總的時間複雜度為\(o(n\log_2n)\)。

值得注意的是,歸併操作需要額外開闢記憶體以提供臨時列表。比較耗記憶體,但效率高且穩定。改進歸併排序在歸併時先判斷前段序列的最大值與後段序列最小值的關係再確定是否進行複製比較。如果前段序列的最大值小於等於後段序列最小值,則說明序列可以直接形成一段有序序列不需要再歸併,反之則需要。所以在序列本身有序的情況下時間複雜度可以降至o(n)。

歸併排序 Merge sort

merge the a s.m and a m 1.t to r s.t template void two merge typet a,typet r,int s,int m,int t while i m r k a i while j t r k a j merge the a 0.n 1 s...

歸併排序(merge sort)

歸併排序 歸併排序是一種遞迴排序演算法,無論陣列元素的原始順序如何,其效能恆定不變。將陣列一分為二,分別排序兩部分元素,再將有序的兩半陣列歸併為乙個有序陣列。歸併步驟比較陣列前一半的元素與陣列的後一半元素,並將較小元素移到臨時陣列,該過程繼續前進,直到其中一半再沒有元素為止。此後只需將其餘元素移到臨...

歸併排序 Merge Sort

歸併排序 merge sort 是利用 歸併 技術來進行排序。歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。兩路歸併演算法 1 演算法基本思路 設兩個有序的子檔案 相當於輸入堆 放在同一向量中相鄰的位置上 r low.m r m 1.high 先將它們合併到乙個區域性的暫存向量r1 相當於輸出...