歸併排序原理

2021-09-17 20:47:32 字數 1266 閱讀 3899

和選擇排序一樣,歸併排序的效能不受輸入資料的影響,但表現比選擇排序好的多,因為始終都是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...