歸併排序(Python)

2021-09-12 07:08:44 字數 2385 閱讀 2736

歸併排序的核心思想:如果要排序乙個陣列,我們先把陣列從中間分成前後兩部分,然後對前後兩部分分別排序,再將排好序的兩部分合併在一起,這樣整個陣列就都有序了。

歸併排序的執行效率與要排序的原始陣列的有序程度無關,所以其時間複雜度是非常穩定的,不管是最好情況、最壞情況,還是平均情況,時間複雜度都是o(nlogn)。空間複雜度是 o(n)。

'''歸併排序演算法,a是int型列表'''

def merge_sort(a):

_merge_sort_between(a, 0, len(a) - 1)

'''遞迴呼叫函式'''

def _merge_sort_between(a, low, high):

if low < high: # 必要,特殊情況排查

mid = low + (high - low)//2

_merge_sort_between(a, low, mid)

_merge_sort_between(a, mid+1, high)

if a[mid] > a[mid+1]: # 時間優化:當前部分<=後部分時,則不需用進行merge操作

_merge(a, low, mid, high)

def _merge(a, low, mid, high):

# a[low...mid], a[mid+1...high] are sorted.

# 游標i , j 分別指向 a[low...mid], a[mid+1...high] 的第乙個元素

i, j = low, mid + 1

tmp = # 臨時陣列

while i <= mid and j <= high:

if a[i] <= a[j]:

i += 1

else:

j += 1

# 迴圈結束時,會有乙個子陣列有剩餘的資料

# if i <= mid ,說明前半個子陣列有剩餘的資料,start = i ,否則start = j

start = i if i <= mid else j

end = mid if i <= mid else high

# 將剩餘的資料新增到 tmp 中

tmp.extend(a[start:end + 1])

# 將 tmp 中的陣列拷貝回 a[low...high]

a[low:high + 1] = tmp

if __name__ == "__main__":

a1 = [3, 5, 6, 7, 8]

a2 = [2, 2, 2, 2]

a3 = [4, 3, 2, 1]

a4 = [5, -1, 9, 3, 7, 8, 3, -2, 9]

merge_sort(a1)

print(a1)

merge_sort(a2)

print(a2)

merge_sort(a3)

print(a3)

merge_sort(a4)

print(a4)

歸併排序和快速排序是兩種稍微複雜的排序演算法,它們用的都是分治的思想,**都通過遞迴來實現,過程非常相似。理解歸併排序的重點是理解遞推公式和merge() 合併函式。同理,理解快排的重點也是理解遞推公式,還有partition() 分割槽函式。

歸併排序演算法是一種在任何情況下時間複雜度都比較穩定的排序演算法,這也使它存在致命的缺點,即歸併排序不是原地排序演算法,空間複雜度比較高,是 o(n)。正因為此,它也沒有快排應用廣泛

快速排序演算法雖然最壞情況下的時間複雜度是 o(n^2),但是平均情況下時間複雜度都是o(nlogn)。不僅如此,快速排序演算法時間複雜度退化到 o(n^2) 的概率非常小,我們可以通過合理地選擇 pivot 來避免這種情

上圖可見,歸併排序的處理過程是由下到上的,先處理子問題,然後再合併

而快排正好相反,它的處理過程是由上到下的,先分割槽,然後再處理子問題。

歸併排序雖然是穩定的、時間複雜度為 o(nlogn) 的排序演算法,但是它是非原地排序演算法。我們前面講過,歸併之所以是非原地排序演算法,主要原因是合併函式無法在原地執行。快速排序通過設計巧妙的原地分割槽函式,可以實現原地排序,解決了歸併排序占用太多記憶體的問題。

python歸併排序 python 歸併排序

排序思路 1.將陣列分成兩組a,b,建立臨時陣列 c,c長度 a b 2.i,j分別屬於a,b 3.若a i b j 將b j 放入c,j 否則 a i 放入c,i 4.迴圈3步驟,將a或b中剩餘的元素放入c,再將c複製到陣列中 5.遞迴3 4直到a,b序列的長度 1 歸併排序 class merg...

python歸併排序

coding utf 8 def mergesort seq 遞迴 if len seq 1 return seq mid int len seq 2 left mergesort seq mid right mergesort seq mid return merge left,right def...

Python 歸併排序

歸併排序採用分而治之的方法,遞迴求解。將長度為n的列表分成兩個長度為n 2的子串行 對兩個子串行分別採用歸併排序 將兩個排序好的子串行合併成乙個最終的排序列表 如下 coding utf 8 author dreams file merge sort.py time 2018 7 26 9 29 i...