和選擇排序一樣,歸併排序的效能不受輸入資料的影響,但表現比選擇排序好的多,因為始終都是o(n log n)的時間複雜度。代價是需要額外的記憶體空間。
歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。歸併排序是一種穩定的排序方法。將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為2-路歸併。
將乙個序列從中間位置分成兩個序列;
在將這兩個子串行按照第一步繼續二分下去;
直到所有子串行的長度都為1,也就是不可以再二分截止。這時候再兩兩合併成乙個有序序列。
上圖:
def
merge
(a, b)
: c =
h = j =
0while j <
len(a)
and h <
len(b)
:if a[j]
< b[h]:)
j +=
1else:)
h +=
1if j ==
len(a)
:for i in b[h:]:
else
:for i in a[j:]:
return c
defmerge_sort
(s):
iflen
(s)<=1:
return s
middle =
len(s)//2
left = merge_sort(s[
:middle]
) right = merge_sort(s[middle:])
return merge(left, right)
if __name__ ==
'__main__'
: s=[2
,8,9
,1,3
]print
(merge_sort(s)
)
時間複雜度
當有n個記錄時,需進行⌈logn⌉輪歸併排序,每一輪歸併,其估計值比較次數不超過n,元素移動次數都是n,因此,歸併排序的時間複雜度為o(nlogn)。
空間複雜度
用容器實現歸併排序時,需要和待排序記錄個數相等的儲存空間,所以空間複雜度為o(n)。
該演算法是穩定排序。
java 歸併排序原理
package cn.exercise 歸併排序 o nlogn author yang public class mergearray bridge new int sorted.length segmentation sorted,0,sorted.length 1 bridge null 分割...
歸併排序(2 路歸併排序)
遞迴寫法 include define maxn 100 void merge int a,int l1,int r1,int l2,int r2 將陣列a的區間 l1,r1 和區間 l2,r2 合併為乙個有序區間 else while i r1 while j r2 for int i 0 i非遞...
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...