1. 程式人生 > >【算法】歸並排序

【算法】歸並排序

開始 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 # 返回排好序的數組

【算法】歸並排序