1. 程式人生 > >歸並排序之python

歸並排序之python

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