演算法筆記 歸併排序02

2021-10-25 02:28:45 字數 1518 閱讀 4199

步驟為:

歸併排序是採用分治法的乙個非常典型的應用。歸併排序的思想就是先遞迴分解陣列,再合併陣列。

將陣列分解最小之後,然後合併兩個有序陣列,基本思路是比較兩個陣列的最前面的數,誰小就先取誰,取了後相應的指標就往後移一位。然後再比較,直至乙個陣列為空,最後把另乙個陣列的剩餘部分複製過來即可。

#!/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 對於乙個待排序的陣列,我們可以先遞迴地將它分成兩半分別排序,然後將結果歸併起來。簡單的說就是把乙個陣列分成兩半,然後把這兩半分別排好序,最後將這兩部分合在一起進行排序,實際情況下,分成兩部分陣列的排序仍然是採用歸併的方式,所以我們會使用到遞迴的思想來操作。前提是待排序陣...