步驟為:
歸併排序是採用分治法的乙個非常典型的應用。歸併排序的思想就是先遞迴分解陣列,再合併陣列。
將陣列分解最小之後,然後合併兩個有序陣列,基本思路是比較兩個陣列的最前面的數,誰小就先取誰,取了後相應的指標就往後移一位。然後再比較,直至乙個陣列為空,最後把另乙個陣列的剩餘部分複製過來即可。
#!/usr/bin/env python3.6.5
# -*- coding: utf-8 -*-
"""author: yanyong
date: 2020/10/2 20:34
docs:
"""def
merge_sort
(alist):
"""歸併排序"""
n = len(alist)
if n <= 1:
return alist
mid = n//2
# left 採用歸併排序後形成的有序的新的列表
left_li = merge_sort(alist[:mid])
# right 採用歸併排序後形成的有序的新的列表
right_li = merge_sort(alist[mid:])
# 將兩個有序的子串行合併為乙個新的整體
# merge(left, right)
left_pointer, right_pointer = 0, 0
result += left_li[left_pointer:]
result += right_li[right_pointer:]
return result
if __name__ == "__main__":
li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
print(li)
sorted_li = merge_sort(li)
print(li)
print(sorted_li)
時間複雜度
最優時間複雜度:o(nlogn)
最壞時間複雜度:o(n2)
穩定性:不穩定
從一開始快速排序平均需要花費o(n log n)時間的描述並不明顯。但是不難觀察到的是分割槽運算,陣列的元素都會在每次迴圈中走訪過一次,使用o(n)的時間。在使用結合(concatenation)的版本中,這項運算也是o(n)。
在最好的情況,每次我們執行一次分割槽,我們會把乙個數列分為兩個幾近相等的片段。這個意思就是每次遞迴呼叫處理一半大小的數列。因此,在到達大小為一的數列前,我們只要作log n次巢狀的呼叫。這個意思就是呼叫樹的深度是o(log n)。但是在同一層次結構的兩個程式呼叫中,不會處理到原來數列的相同部分;因此,程式呼叫的每一層次結構總共全部僅需要o(n)的時間(每個呼叫有某些共同的額外耗費,但是因為在每一層次結構僅僅只有o(n)個呼叫,這些被歸納在o(n)係數中)。結果是這個演算法僅需使用o(n log n)時間
02歸併排序
基於分治的思想 1.選中陣列中間元素為分界點 2.遞迴排序分界點的左邊和右邊 3.歸併兩個有序的陣列,合二為一 難點 歸併排序需要建立額外的陣列 def merge sort q,l,r if l r return mid l r 2 這裡取陣列的中間元素作為分界點 merge sort q,l,m...
《演算法筆記》 歸併排序
歸併操作,也叫歸併演算法,指的是將兩個順序序列合併成乙個順序序列的方法,平均時間複雜度為o nlogn 歸併排序的實現分為遞迴實現與非遞迴 迭代 實現。如 設有數列 初始狀態 6,202,100,301,38,8,1 第一次歸併後 比較次數 3 第二次歸併後 比較次數 4 第三次歸併後 比較次數 4...
演算法筆記 歸併排序
平均時間複雜度o nlogn 對於乙個待排序的陣列,我們可以先遞迴地將它分成兩半分別排序,然後將結果歸併起來。簡單的說就是把乙個陣列分成兩半,然後把這兩半分別排好序,最後將這兩部分合在一起進行排序,實際情況下,分成兩部分陣列的排序仍然是採用歸併的方式,所以我們會使用到遞迴的思想來操作。前提是待排序陣...