歸併排序Python版本

2021-10-05 15:37:55 字數 2537 閱讀 4155

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

歸併排序是分治演算法的乙個典型應用。分治演算法的思想是 分而治之 。能夠使用分治演算法的問題具有以下特徵:子問題的解合併起來就是原問題的解。接下來以歸併排序的思想來解釋什麼是子問題、子問題的解、子問題的合併、原問題的解。

1、什麼是子問題。子問題就是在規模上比原問題要小的問題,子問題為原問題的一部分。

在歸併排序中,將陣列分解為最小(即單個的數),那麼這個單個的數就是原問題中的乙個子問題。

2、子問題的解。單個的數的解就是其本身。

3、子問題的合併。子問題的合併並不是簡簡單單的將答案拼到一起,有時候需要進行運算,有時候是一些別的演算法。這歸併排序中,當我們把陣列拆成了乙個單個的數後,這乙個個的數就是子問題的解,這個時候要進行子問題的合併。那麼好,將兩個單個的數進行比較大小,然後這兩個單個的數變成了有序的兩個數,把這有序的兩個數放在一邊先不管,繼續將剩下的單個數組成有序的兩個數,這個時候子問題就變成了很多對 兩個有序的數。這個過程即為子問題的合併過程。

4、原問題的解。當我們按照步驟3中那樣做,直到子問題合併成原來的問題,那麼得到的解就為原問題的解。

歸併排序的動態演示圖如下:

1、對陣列分割成子問題

def

merge_sort

(alist)

: num =

len(alist)/2

left = merge_sort(alist[

:num]

) right = merge_sort(alist[num:

])

然後不斷的分割,分割完成的標誌為:

if

len(alist)

<=1:

return alist

2、對子問題進行合併

在進行合併時,使用到了雙指標操作。雙指標在快速排序中也有用到,就是為了提高效率。

def

merge

(left, right)

:'''合併操作,將兩個有序陣列left和right合併成乙個大的有序陣列'''

#left與right的下標指標

l, r =0,

0 result =

while l<

len(left)

and r<

len(right)

:if left[l]

< right[r]:)

l +=

1else:)

r +=

1#下面這兩個**只會執行其中乙個

result += left[l:

] result += right[r:

]return result

到此歸併排序演算法的python實現就已經完成了。

完整**如下:

def

merge_sort

(alist):if

len(alist)

<=1:

return alist

# 二分分解

num =

len(alist)/2

left = merge_sort(alist[

:num]

) right = merge_sort(alist[num:])

# 合併

return merge(left,right)

defmerge

(left, right)

:'''合併操作,將兩個有序陣列left和right合併成乙個大的有序陣列'''

#left與right的下標指標

l, r =0,

0 result =

while l<

len(left)

and r<

len(right)

:if left[l]

< right[r]:)

l +=

1else:)

r +=

1 result += left[l:

] result += right[r:

]return result

alist =[54

,26,93

,17,77

,31,44

,55,20

]sorted_alist = mergesort(alist)

print

(sorted_alist)

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

歸併排序 List版本

歸併排序 list版本 將兩個 或兩個以上 有序表合併成乙個新的有序表 public static list mergesort list list int mid count 2 list left new list 定義左側list list right new list 定義右側list 以下...

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