歸併排序python實現

2021-09-13 20:59:34 字數 1869 閱讀 1892

歸併排序在於把序列拆分再合併起來,使用分治法來實現,這就意味這要構造遞迴演算法

首先是乙個例子

原序先通過一半一半的拆分,然後:

然後再一步一步的向上合併,在合併的過程中完成了排序,合併排序演算法如下:

def

merge

(s1,s2,s)

:"""將兩個列表是s1,s2按順序融合為乙個列表s,s為原列表"""

# j和i就相當於兩個指向的位置,i指s1,j指s2

i = j =

0while i+j<

len(s)

:# j==len(s2)時說明s2走完了,或者s1沒走完並且s1中該位置是最小的

if j==

len(s2)

or(i<

len(s1)

and s1[i]

s[i+j]

= s1[i]

i +=

1else

: s[i+j]

= s2[j]

j +=

1

這是以列表為例,道理其實很簡單,因為兩個序列是排好序的,所以都從左往右,互相比較選擇較小的那個數放入最後的序列,s是原序列,所以在一開始會有與len(s)的比較

演算法中通過遞迴並呼叫merge函式完成排序

def

merge

(s1,s2,s)

:"""將兩個列表是s1,s2按順序融合為乙個列表s,s為原列表"""

# j和i就相當於兩個指向的位置,i指s1,j指s2

i = j =

0while i+j<

len(s)

:# j==len(s2)時說明s2走完了,或者s1沒走完並且s1中該位置是最小的

if j==

len(s2)

or(i<

len(s1)

and s1[i]

s[i+j]

= s1[i]

i +=

1else

: s[i+j]

= s2[j]

j +=

1def

merge_sort

(s):

"""歸併排序"""

n =len(s)

# 剩乙個或沒有直接返回,不用排序

if n <2:

return

# 拆分

mid = n //

2 s1 = s[

0:mid]

s2 = s[mid:n]

# 子串行遞迴呼叫排序

merge_sort(s1)

merge_sort(s2)

# 合併

merge(s1,s2,s)

if __name__ ==

'__main__'

: s =[1

,7,3

,5,4

] merge_sort(s)

print

(s)

還拿這個圖說

這個圖顯然是二叉樹的形式,所以若集合有n個元素,那高度就為log(n)

但其實在每一層做比較的時候,都是乙個乙個的向序列中放小的元素,每一層都是要放n次

所以時間複雜度為nlog(n)

python實現歸併排序

歸併排序,先把陣列按中間分為2個單元,直至每個單元僅包含1個元素,然後依次合併2個單元至一臨時陣列 def merge str,start index,end index,mid,temp j start index k mid 1 i 0while j mid and k end index if...

Python實現歸併排序

def mergesort seq if len seq 1 return seq else mid int len seq 2 lpart mergesort seq mid rpart mergesort seq mid return merge lpart,rpart defmerge lpa...

Python實現歸併排序

歸併排序是典型的分治法的應用 思想 先遞迴分解陣列,再合併陣列 原理 將陣列分解最小之後,然後合併兩個有序陣列,基本思想是比較兩個陣列的最前面的數,誰小就取誰,取完後,將相應的指標後移以為。然後再比較,直到乙個陣列為空,最後把另乙個陣列的剩餘部分複製過來即可。python 實現 歸併排序 def m...