對於歸併排序,與快速排序一樣,巧妙的應用了分治演算法的核心思想,它將整個序列分成若干組子串行,對這些子串行進行排序後,在一步一步進行合併有序子串行,從而使得整個序列達到有序。
但針對於歸併排序,有著兩種不同的排序方式,一是通過整個序列進行著手,將這個序列進行一步一步的劃分,自頂向下進行處理,主要步驟包括序列劃分,子串行排序,以及合併,而這一方法可以通過遞迴來實現;與之相對的就是另外一種方式,自底向上,從最小子序列著手,將其進行兩兩合併,一步一步得到整個有序序列,而這也是我們歸併排序的非遞迴實現方式
①自頂向下(遞迴)
方法如下:
void merge(int arr,int left,int right,int mid,int* tmp)
}void mergesort(int arr,int size)
②自底向上(非遞迴)
方法如下:
void merge(int arr,int left,int right,int mid,int* tmp)
gap*=2;
}delete tmp;
}
值得注意的是,歸併排序不管是非遞迴方法,還是遞迴方法,都需要輔助空間的參與,但是對於遞迴而言,一次遞迴就申請一次空間會降低效率,而且需要注意釋放空間,所以這裡在外部直接申請出一塊足夠的空間,然後將其指標作為引數進行傳遞,而在外部進行釋放,也是相當方便。
對於歸併排序的時間複雜度為o(nlogn),空間複雜度為o(n),而且歸併排序是穩定的
與前面所有的排序演算法不一樣,歸併排序屬於外部排序,而對於外部排序而言,與內部排序最大的區別在於外部排序在進行排序時,並不需要得到所有資料,可以將大量的資料分成若干組,分別對其進行排序,最後再綜合起來排序,適合與大量資料的排序
排序演算法 六 歸併排序
歸併排序的基本思想是分治法。先將無序序列分為若干個無序子串行,然後對無序子串行進行排序,最後合併有序子串行,得到完全有序的序列。這就是分解,求解,合併的過程。將待排序序列data 0,1,2 n 1 看成是n個長度為一的序列,將相鄰序列進行合併,得到n 2個長度為2的有序序列 將相鄰序列再次進行合併...
排序演算法(六) 歸併排序
歸併排序 merge sort 又稱二路歸併排序,是指將乙個陣列一分為二,對每乙個子陣列遞迴排序,最後將排好的子陣列合併為乙個有序陣列的過程。歸併排序,是 分治法 應用的完美實現。1.歸併排序圖示 2.歸併排序流程 通過圖示,可以發現歸併排序一共只需要兩個步驟 3.實現 歸併排序的 邏輯還是很容易看...
六 歸併排序
要將乙個陣列排序,可以先 遞迴的 將它分成層兩半分別排序,然後將結果歸併起來。它能保證任意長度為n的陣列排序所需時間和nlogn成正比 它的缺點則是它所需的額外空間和n成正比。實現歸併的一種直截了當的辦法是將兩個不同的有序陣列歸併到第三個陣列中,兩個陣列中的元素應該都實現了comparable藉口。...