首先,歸併排序使用了二分法,歸根到底的思想還是分而治之。拿到乙個長陣列,將其不停的分為左邊和右邊兩份,然後以此遞迴分下去。然後再將它們按照兩個有序陣列的樣子合併起來。這樣說起來可能很難理解,所以 圖就來了:
歸併排序將陣列以中間的值進行拆分,最後分到最細之後再將其使用對兩個有序陣列進行排序的方法對其進行排序。
兩個有序陣列排序的方法則非常簡單,同時對兩個陣列的第乙個位置進行比大小,將小的放入乙個空陣列,然後將放入空陣列的那個位置的指標往後移乙個,然後繼續和另外乙個陣列的上乙個位置進行比較,以此類推。到最後任何乙個陣列先出棧完,就將另外乙個陣列裡的所有元素追加到新陣列後面。
遞迴拆分的時間複雜度是logn,進行兩個有序陣列排序的方法複雜度是n,所以該演算法的時間複雜度是n*logn,即nlogn。
python**示例:
lst = [2, 5, 7, 8, 9, 1, 3, 4, 6]defmerge_sort(lst, low, high):
#不斷遞迴呼叫自己,直至拆分成單個元素的時候返回這個元素,不再拆分
if low
#取拆分的中間位置
mid = (low + high) // 2merge_sort(lst, low, mid) #左
merge_sort(lst, mid + 1, high) #
右merge(lst, low, mid, high)
defmerge(lst, low, mid, high):
i, j = low, mid + 1ltmp =
#這個迴圈的作用是:
#從兩個有順序的列表裡,按順序從左到右依次比較值的大小,並把較小的放入ltmp中
#最終,會有乙個列表被取完,而另乙個列表沒有被取完
while i <= mid and j <=high:
if lst[i] <=lst[j]:
i += 1
else
: j += 1
#如果左邊的列表沒有被取完:
while i <=mid:
i += 1
#如果右邊的列表沒有被取完:
while j <=high:
j += 1lst[low:high + 1] =ltmp
merge_sort(lst, 0, len(lst) - 1)
print(lst)
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...