歸併排序是採用分治法的乙個非常典型的應用。歸併排序的思想就是先遞迴分解陣列,再合併陣列。
將陣列分解最小之後,然後合併兩個有序陣列,基本思路是比較兩個陣列的最前面的數,誰小就先取誰,取了後相應的指標就往後移一位。然後再比較,直至乙個陣列為空,最後把另乙個陣列的剩餘部分複製過來即可。
#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...