Python 歸併排序

2021-10-09 23:20:22 字數 1894 閱讀 5377

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

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

#coding=utf-8

#@time:2020/10/4 8:36

#@author:csdn@hijacklei

#@file:歸併排序演算法.py

#@software:pycharm

defmerge_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:])

'''因為alist[:mid]不包含mid,alist[mid:]包含mid,所以全部的元素都包含進來'''

#將兩個有序的子串行合併成為乙個新的序列

#設定游標的起始位置

left_cur,right_cur=0,

0#相當於是之前拆分後的兩個部分的最開始值得索引位置

#定義乙個待重新合併的新列表

result=

while left_cur<

len(left_li)

and right_cur<

len(right_li)

:if left_li[left_cur]

left_cur+=

1else:)

right_cur+=

1#在迴圈完上面的大小的對比後,然後進行剩下部分合併

result+=left_li[left_cur:

] result+=right_li[right_cur:

]return result

if __name__ ==

'__main__'

: li =[54

,26,93

,17,77

,31,44

,55,20

]#列印原序列

print

(li)

#返回[54, 26, 93, 17, 77, 31, 44, 55, 20]

merge_sort_li=merge_sort(li)

# 列印排序後的li序列

print

(li)

#返回[54, 26, 93, 17, 77, 31, 44, 55, 20]

# 列印排序後重新組合的序列

print

(merge_sort_li)

#返回 [17, 20, 26, 31, 44, 54, 55, 77, 93]

思路:

歸併排序演算法的主要思路就是將乙個序列不斷的拆分,然後拆分到只有乙個元素的序列,然後進行合併,合併的規則是小的在前,大的在後的原則;

然後迴圈這樣的合併排序,序列大於乙個元素的時候借助游標來滑動進行排序;

直到游標滑倒拆分兩部分分最末尾的位置;

將剩下元素新增到乙個列表result,排序結束;

總之就是一級一級的巢狀,然後合併,返回列表,退出巢狀的過程。

整體的時間複雜度的計算就是用橫向的執行步驟n *拆分的步驟,拆分是logn,也可以看成是縱向的拆分的步驟,整體的相乘就是時間複雜度的計算

最優時間複雜度:

最壞時間複雜度:

python歸併排序 python 歸併排序

排序思路 1.將陣列分成兩組a,b,建立臨時陣列 c,c長度 a b 2.i,j分別屬於a,b 3.若a i b j 將b j 放入c,j 否則 a i 放入c,i 4.迴圈3步驟,將a或b中剩餘的元素放入c,再將c複製到陣列中 5.遞迴3 4直到a,b序列的長度 1 歸併排序 class merg...

python歸併排序

coding utf 8 def mergesort seq 遞迴 if len seq 1 return seq mid int len seq 2 left mergesort seq mid right mergesort seq mid return merge left,right def...

Python 歸併排序

歸併排序採用分而治之的方法,遞迴求解。將長度為n的列表分成兩個長度為n 2的子串行 對兩個子串行分別採用歸併排序 將兩個排序好的子串行合併成乙個最終的排序列表 如下 coding utf 8 author dreams file merge sort.py time 2018 7 26 9 29 i...