python 資料結構與演算法 day05 歸併排序
阿新 • • 發佈:2018-11-12
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. 穩定性
歸併排序是穩定的;