首先介紹歸併排序思想:將陣列分解最小之後,然後合併兩個有序陣列,基本思路是比較兩個陣列的最前面的數,誰小就先取誰,取了後相應的指標就往後移一位。然後再比較,直至乙個陣列為空,最後把另乙個陣列的剩餘部分複製過來即可。
歸併排序是分治演算法的乙個典型應用。分治演算法的思想是 分而治之 。能夠使用分治演算法的問題具有以下特徵:子問題的解合併起來就是原問題的解。接下來以歸併排序的思想來解釋什麼是子問題、子問題的解、子問題的合併、原問題的解。
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...