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

2021-07-08 20:46:32 字數 1339 閱讀 2407

歸併排序(mergesort)是大神馮諾依曼研發的一款高效且穩定的排序演算法,據資料顯示,python自帶排序函式用的就是歸併排序。其穩定性和效率肯定是毋庸置疑的了,學好歸併排序非常有用,是多路歸併排序的功底課(多路歸併排序在海量資料環境下記憶體不足是非常有用)。

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

空間複雜度:o(n)

下面我講解一下歸併排序的排序流程:

給定乙個列表,裡面有許多待排序的數,諸如:l=[35, 24,16,28,20,4,32,10],我對這個l進行歸併排序:

1.首先讀者要了解的是,歸併排序使用的是分治的遞迴思想(將問題分成差不多相等的兩塊,分而治之,將較大的問題轉換成較小的問題,有助於減小時間複雜度)。那麼我們先將原問題分為l_l=[35,24,16,28]和l_r=[20,4,32,10]兩個部分,隨後左右兩個部分繼續分,直到分成乙個數為止。

排序模擬:

1. l=[(24,35),(16,28),(4,20),(10,32)]   

2. l=[(16,24,28,35),(4,10,20,32)]

3. l=[4,10,16,20,24,28,32,35]

python原始碼:

def mergesort(list):

if len(list) == 1:

return list

else:

list_left = mergesort(list[0:len(list)/2])

list_right = mergesort(list[len(list)/2 : len(list)])

return merge(list_left, list_right)

def merge(list_left, list_right):

# i為list_left的第乙個元素

# j為list_right的第乙個元素

# 列表r是list_left和list_right排完序的列表

r =

i = j = 0

lenth_l = len(list_left)

lenth_r = len(list_right)

while i

與系統mergesort效能對比:

可以看到雖然與系統排序效能仍然有很大的距離,但是相比快速排序效率竟然提高了,不知道是為什麼。。。

二分歸併排序演算法 排序演算法之歸併排序

一 分治模式 許多有用的演算法在結構上是遞迴的 為了解決乙個給定的問題,演算法一次或多次遞迴地呼叫其自身以解決緊密相關的若干子問題。這些演算法典型地遵循分治法的思想 將原問題分解為幾個規模較小但類似於原問題的子問題。遞迴的求解這些問題,然後再合併這些子問題的解來建立原問題的解。分治模式在每層遞迴都有...

排序演算法 歸併排序

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 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 ...