【算法】歸並排序
阿新 • • 發佈:2019-03-28
開始 ret 不為 bsp mic src n) image 劃分
歸並排序
對於一個待排序的數組,先將數組分成兩部分,如果劃分之後的一部分數組數目大於1,則我們繼續對其劃分,直到分成單個元素的數組。然後我們在申請相應的輔助空間,將兩個數組進行進行合並,得到一個排序之後的數組,然後反復進行對比排序,直到生成一個最終和原數組一樣大的排好序的數組。
歸並排序使用的是分而治之的思想,簡單的來說就是將一個大問題,分解成很多小問題,然後從小的問題開始解決,但小的問題解決了,大的問題也就解決了。
復雜度分析
歸並排序在排序過程中使用了輔助空間,來依此放置最小的元素,所以其空間復雜度為O(n),時間復雜度為O(nlogn),這裏和快排不一樣,快排平均時間復雜度為O(nlogn),但是有些時候也會退化成O(n2 ),存在不穩定的因素,但是歸並排序的時間復雜度比較穩定,一直都是O(nlogn), 這是因為它使用了輔助空間來進行排序。另外它也是一個穩定排序,不是原地排序。
圖示步驟
代碼實現
1 def merge_sort(arry):
2 if len(arry) < 2:
3 return arry
4 mid = len(arry)//2
5 left = merge_sort(arry[:mid]) # 進行劃分
6 right = merge_sort(arry[mid:])
7 return merge(left, right) # 進行合並
8
9
10 def merge(left, right):
11 l_count = r_count = 0
12 tem_arry = [] # 申請輔助數組
13 while l_count < len(left) and r_count < len(right):
14 if left[l_count] < right[r_count]: # 當左邊元素小於右邊元素時,將左邊元素加到輔助數組中
15 tem_arry.append(left[l_count])
16 l_count += 1
17 else:
18 tem_arry.append(right[r_count])
19 r_count += 1
20 if l_count < len(left): # 當一個數組中的元素添加完畢之後,我們檢查另外一個數組是否為空,然後將不為空的數組元素添加進去。
21 for i in left[l_count:]:
22 tem_arry.append(i)
23 else:
24 for i in right[r_count:]:
25 tem_arry.append(i)
26 return tem_arry # 返回排好序的數組
【算法】歸並排序