演算法和資料結構之 歸併排序

2021-10-07 11:49:49 字數 1462 閱讀 7420

和選擇排序一樣,歸併排序的效能不受輸入資料的影響,但表現比選擇排序好的多,因為始終都是o(n log n)的時間複雜度。代價是需要額外的記憶體空間。歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。歸併排序是一種穩定的排序方法。將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為2-路歸併

//step2:從下往上歸併

void

merge

(int

*a,int

*l,int leftcount,

int*r,

int rightcount)

else

}while

(i < leftcount)

while

(j < rightcount)

}//step1:從上往下分治

void

mergesort

(int

*a,int n)

mid = n /2;

l =newint

[mid]

;//如果n為奇數,則左邊元素個數比右邊元素個數多乙個,要使左邊元素個數大於右邊元素個數可以令 mid=(n+1) / 2

r =newint

[n - mid]

;for

(int i =

0; i < mid; i++

)for

(int i = mid; i < n; i++

)//後序遍歷

mergesort

(l, mid)

;mergesort

(r, n - mid)

;merge

(a, l, mid, r, n - mid)

;delete

l;delete

r;}int

main()

;int i, numberofelements;

numberofelements =

sizeof

(a)/

sizeof

(a[0])

;mergesort

(a, numberofelements)

;for

(i =

0; i < numberofelements; i++

) cout <<

" "<< a[i]

;return0;

}

如下圖,演算法的執行順序等同於後序遍歷:1-2-3-4-5-6-7-8-9,每執行一次,delete一次。

資料結構 排序演算法之歸併排序

基本思想 將待排序的元素序列分成兩個等長的子串行,再將子串行劃分子串行,直到子串行中只有乙個元素就不用在對子序列繼續進行劃分,將劃分的每個區塊,進行排序,然後再將其歸併到乙個序列中,直到將所有的子串行歸併完成之後,則這個序列就完成了排序。1 基本思想如下所示 經過上面的劃分,從而可以看出經過劃分與歸...

資料結構 排序演算法之歸併排序

演算法思想 歸併排序是利用歸併的思想實現的排序方法,該演算法採用 分而治之 的思想將問題分成一些小的問題然後遞迴實現,最後合而為之。實現 遞迴實現 void merge int arr,const int left,const int mid,const int right,int temp whi...

資料結構之歸併排序

介紹 歸併排序是建立在歸併操作上的一種有效的排序演算法,效率為o nlogn 歸併排序的實現分為遞迴實現與非遞迴 迭代 實現。遞迴實現的歸併排序是演算法設計中分治策略的典型應用,我們將乙個大問題分割成小問題分別解決,然後用所有小問題的答案來解決整個大問題。非遞迴 迭代 實現的歸併排序首先進行是兩兩歸...