高階排序演算法之歸併排序

2022-09-19 07:54:14 字數 1267 閱讀 6222

歸併排序演算法的時間複雜度能達到nlog(n)。

歸併排序演算法的基本思想:歸併排序演算法是把資料逐次分割成每塊,對每塊進行排序後,然後再進行合併成為乙個排好序的資料。

第一步:資料平均分割

第二步:再次對資料進行平均分割,直到資料無法再分割,也就是每份資料只有乙個了,然後再對每份資料進行合併,依次向上進行合併每份有序的資料。

根據以上演算法的基本思想,相信大家也想到了,歸併排序使用遞迴實現起來相對更加簡單。以上所說的歸併排序為自頂向下的歸併排序演算法,還有一種自底向上的歸併排序演算法實現下邊再說。

以下是自頂向下的歸併排序演算法的實現示例:

templatevoid __merge(t arr, int l, int mid, int r)

else if(j > r)

else if(aux[i-l] < aux[j-l])

else

} delete aux;

}templatevoid __mergesort(t arr, int l, int r)

int mid = (l + r)/2;

__mergesort(arr, l, mid);

__mergesort(arr, mid + 1, r);

if(arr[mid] > arr[mid+1]) //優化點1:對於arr[mid] <= arr[mid+1]的情況不需要進行merge

__merge(arr, l, mid, r);

}//此為自頂向下的歸併排序演算法

templatevoid mergesort(t arr, int n)

自底向上的歸併排序演算法與自頂向下的歸併排序正好相反,先指定乙個步長,把資料按步長分割,每份資料使用插入排序演算法(插入排序對小資料量效能好,插入排序參考博文)

示例**:

templatevoid insertionsort(t arr, int l, int r)

}

//此為自底向上的歸併排序演算法

templatevoid mergesortbu(t arr, int n)

歸併排序演算法的時間複雜度為nlog(n),相對與時間複雜度為o(n^2)的選擇排序、插入排序、氣泡排序等基礎排序演算法更好,但在小資料量或者幾乎有序的資料中,時間複雜度為o(n^2)的插入排序與nlog(n)的歸併排序相差無幾。

排序演算法之歸併排序

歸併排序也是經典的使用分治法思想的代表演算法之一。歸併排序的效率很高,而且是一種穩定的排序。其總體的思想思路就是將待排序的元素分成大致相同的兩個子集合,分別對兩個子集合進行排序,最終將排序的子集合合併成排好序的總集合 歸併排序c 實現如下 include void mergesort int arr...

排序演算法之歸併排序

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用,歸併排序將兩個已排序的表合併成乙個表。歸併排序基本原理 通過對若干個有序結點序列的歸併來實現排序。所謂歸併是指將若干個已排好序的部分合併成乙個有序的部分。歸併排序基本思...

排序演算法之歸併排序

歸併排序,和快排一樣同樣採用了分治的思想,將兩個 或以上 有序表合併成乙個新的有序表。歸併排序步驟如下 把n個記錄看成 n個長度為 1 的有序子表 進行兩兩歸併使記錄關鍵字有序,得到 n 2 個長度為 2 的有序子表 重複第2步直到所有記錄歸併成乙個長度為n的有序表為止。下面是歸併排序演算法的遞迴實...