1. 程式人生 > >python 資料結構與演算法 day05 歸併排序

python 資料結構與演算法 day05 歸併排序

1.歸併排序

思路: 逐步把一個序列拆分,每次拆一半,直到拆成n個元素的序列,拆完之後開始合併,兩個兩個合併,合併完 之後再四個一組合並,依次合併為原來長度的序列;

整個過程使用遞迴

 

2. 程式碼實現

def merge_sort(L):
    """歸併排序"""
    if len(L)==1:
        return L
    mid=len(L)//2
    left_list=merge_sort(L[:mid])
    right_list=merge_sort(L[mid:])
    left_pointer,right_pointer
=0,0 result=[] while left_pointer<len(left_list) and right_pointer<=len(right_list): if left_list[left_pointer]<right_list[right_pointer]: result.append(left_list[left_pointer]) left_pointer+=1 else: result.append(right_list[right_pointer]) right_pointer
+=1 result+=left_list[left_pointer:] result+=right_list[right_pointer:] return result L=[5,2,8,3,7,1,9,4] L_sorted=merge_sort(L) print(L) print(L_sorted)

執行結果:

 

3. 時間複雜度

歸併排序時間複雜度 nlog(n) 拆分之後合併的過程,橫向複雜度n (因為總共需要比較n個元素);

縱向時間複雜度是log(n)因為從n個元素的序列逐步合併,最終合併為一個大的序列 2^k=n  合併的過程總共有log(n)次

所以歸併排序的時間複雜度 nlog(n)

 

4. 穩定性

歸併排序是穩定的;