python實現歸併排序

2021-09-26 04:59:30 字數 1890 閱讀 7969

(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...