和選擇排序一樣,歸併排序的效能不受輸入資料的影響,但表現比選擇排序好的多,因為始終都是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 歸併排序的實現分為遞迴實現與非遞迴 迭代 實現。遞迴實現的歸併排序是演算法設計中分治策略的典型應用,我們將乙個大問題分割成小問題分別解決,然後用所有小問題的答案來解決整個大問題。非遞迴 迭代 實現的歸併排序首先進行是兩兩歸...