歸並排序之python
阿新 • • 發佈:2018-06-02
art 分治 tar 圖片 IV sorted ace als ()
歸並排序( Merge sort)
歸並排序是建立在歸並操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合並,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合並成一個有序表,稱為2-路歸並。
1.算法描述:
- 分而治之
- 分 :
- 遞歸地拆分數組,直到它被分成兩對單個元素數組為止.
- 然後,將這些單個元素中的每一個與它的對合並,然後將這些對與它們的對等合並, 直到整個列表按照排序順序合並為止.
- 治 :
- 將2個排序列表合並為另一個排序列表是很簡單的.
- 簡單地通過比較每個列表的頭,刪除最小的,以加入新排序的列表.
- O(n) 操作
2.算法屬性:
- 穩定
- 算法時間復雜度:O(nlogn)
3.代碼實現
#算法時間復雜度 O(logN) #遞歸 #兩個步驟:1.拆分 2.合並 def _merge(a: list, b: list) -> list: #合並兩個排序表 c = [] while len(a) > 0 and len(b) > 0: if a[0] < b[0]: c.append(a[0]) a.remove(a[0]) else: c.append(b[0]) b.remove(b[0])if len(a) == 0: c += b else: c += a return c def _merge_sorted(nums: list) -> list: # Won‘t sort in place if len(nums) <= 1: return nums m = len(nums) // 2 a = _merge_sorted(nums[:m]) #前半 b = _merge_sorted(nums[m:]) #後半 return _merge(a, b)# Wrapper包裝器 def merge_sorted(nums: list, reverse=False) -> list: import time start = time.time() #歸並排序 nums = _merge_sorted(nums) if reverse: nums = nums[::-1] t = time.time() - start return nums, len(nums), t lis = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0] merge_sorted(l, reverse=False)[0] #輸出結果 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
歸並排序之python