歸并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應(yīng)用。 首先考慮下如何將將二個有序數(shù)列合并。這個非常簡單,只要從比較二個數(shù)列的第一個數(shù),誰小就先取誰,取了后就在對應(yīng)數(shù)列中刪除這個數(shù)。然后再進行比較,如果有數(shù)列為空,那直接將另一個數(shù)列的數(shù)據(jù)依次取出即可。
可以看出合并有序數(shù)列的效率是比較高的,可以達到O(n)。 解決了上面的合并有序數(shù)列問題,再來看歸并排序,其的基本思路就是將數(shù)組分成二組A,B,如果這二組組內(nèi)的數(shù)據(jù)都是有序的,那么就可以很方便的將這二組數(shù)據(jù)進行排序。如何讓這二組組內(nèi)數(shù)據(jù)有序了? 可以將A,B組各自再分成二組。依次類推,當(dāng)分出來的小組只有一個數(shù)據(jù)時,可以認(rèn)為這個小組組內(nèi)已經(jīng)達到了有序,然后再合并相鄰的二個小組就可以了。這樣通過先遞歸的分解數(shù)列,再合并數(shù)列就完成了歸并排序。
歸 并排序的效率是比較高的,設(shè)數(shù)列長為N,將數(shù)列分開成小數(shù)列一共要logN步,每步都是一個合并有序數(shù)列的過程,時間復(fù)雜度可以記為O(N),故一共為 O(N*logN)。因為歸并排序每次都是在相鄰的數(shù)據(jù)中進行操作,所以歸并排序在O(N*logN)的幾種排序方法(快速排序,歸并排序,希爾排序,堆 排序)也是效率比較高的。
在本人電腦上對冒泡排序,直接插入排序,歸并排序及直接使用系統(tǒng)的qsort()進行比較(均在Release版本下) 對20000個隨機數(shù)據(jù)進行測試: 對50000個隨機數(shù)據(jù)進行測試: 再對200000個隨機數(shù)據(jù)進行測試:
注:有的書上是在mergearray()合并有序數(shù)列時分配臨時數(shù)組,但是過多的new操作會非常費時。因此作了下小小的變化。只在MergeSort()中new一個臨時數(shù)組。后面的操作都共用這一個臨時數(shù)組。
|
|