(1)歸併排序就是先進行分解操作,再進行合併操作
(2)當分解到最小以後,就進行合併,合併的同時比較兩兩陣列之間的大小將其排序好
(3)這樣的分解時需要用遞迴來實現的。
(4)如果排序元素是奇數個,辣麼對於最後乙個數字的處理。
def merge_sort(alist):
"""歸併排序"""
n=len(alist)
if n <=1:
return alist
mid=n//2
#left採用歸併排序後形成的有序的新的列表
left_list=merge_sort(alist[:mid])
#right採用歸併排序後形成的有序的新的列表
right_list=merge_sort(alist[mid:])
#完成拆分過程。
#將兩個有序子串行合併成乙個新的整體
#merge(left,right)
left_pointer,right_pointer=0,0 #需要左指標右指標指向新的列表開頭用於排序
result= #用於儲存新的排序列表
while left_pointer根據分析的思路,我們可以就得知:
(1)分解操作:
首先我們要曉得列表中間的元素,辣麼就用mid=n//2記錄,然後通過遞迴方式進行拆分,當進行到長度小於或者等於零的時候就停止拆分工作。==這裡需要注意的是:==我們操作的不在是同乙個列表,是不同的一塊一塊的列表了,因此我們需要變數來記錄,因此會出現left_list, right_list。最後遞迴的終止條件也是要返回列表的。
(3)重新組合:
我們定義兩個變數來指向每乙個列表的頭( left_pointer,right_pointer=0,0 )。比較左右列表之間的大小關係(我們以從小到大方式為例),如果左邊元素小就追加到乙個新的result裡面去,同時指標向後移動,反之,將右邊追加到result,並移動指標。迴圈操作的條件是兩個指標都是小於原來指向列表的長度的時候,進行迴圈操作。
(4)對於最後乙個數字的處理:
(1)進入merge_sort(a),
(2)執行left_list=merge_sort(alist[:mid])操作。
left_list=[54,26,93,17]
left_list=[54,26]
left_list=[54]
此時n1所以退出left_list=merge_sort(alist[:mid])迴圈,並return[54]
(3)然後執行 right_list=merge_sort(alist[mid:])操作
right_list=[26]
此時n1所以退出 right_list=merge_sort(alist[mid:])迴圈,並return[26]
(4)此時執行合併演算法 返回[26,54]
此時此刻對於left_list=[54,26,93,17] 來說已經完成了左邊排序的操作,後面進行right_list=[93,17] 操作,操作過程同上類似,最後返回[17,93]
(5)此時此刻,我們完成了[54,26,93,17,77,31,44,55]左邊的演算法,後面就同時進項右邊操作,[77,31,44,55],一部一部按照**和遞迴思想進行操作
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...