排序演算法之歸併排序

2021-08-03 03:49:56 字數 1569 閱讀 7710

歸併排序

歸併排序(merge sort)就是利用分治法的思想實現的排序方法。它的原理是假設初始序列含有n個記錄,則可以看成是n個有序的子串行,每個子串行的長度為1,然後兩輛歸併,得到得到個n/2個長度為2或者1的有序子串行;兩兩再歸併,……,如此重複,直到得到乙個長度為n的有序序列為止,這種排序方法稱為2路歸併排序,

屬於穩定排序

例如陣列a有7個資料,分別是: 49 38 65 97 76 13 27,那麼採用歸併排序演算法的操作過程如圖7所示: 

初始值 [49] [38] [65] [97] [76] [13] [27] 

看成由長度為1的7個子序列組成 

第一次合併之後 [38 49] [65 97] [13 76] [27] 

看成由長度為1或2的4個子序列組成 

第二次合併之後 [38 49 65 97] [13 27 76] 

看成由長度為4或3的2個子序列組成 

第三次合併之後 [13 27 38 49 65 76 97] 

歸併演算法的核心操作就是將一維陣列中前後相鄰的兩個兩個有序序列合併成乙個有序序列。歸併演算法也可以採用遞迴演算法來實現,形式上較為簡單,但實用性很差。歸併演算法的歸併次數是乙個非常重要的量,根據計算當陣列中有3到4個元素時,歸併次數是2次,當有5到8個元素時,歸併次數是3次,當有9到16個元素時,歸併次數是4次,按照這一規律,當有n個子序列時可以推斷出歸併的次數是x(2 >=n,符合此條件的最小那個x)。

其時間複雜度為:o(nlogn).所需輔助儲存空間為:o(n)

遞迴版本**

#include 

#include

using namespace std;

void merge(int a, int low, int mid, int high)

while(i<=mid)

while(j<=high)

for(p=0, i=low; i<=high;)

free(tmp);

}void mergesort(int a, int low, int high)

}int main();

cout << "original array: " << endl;

for(int i=0; i<9; i++)

cout << a[i] << " ";

cout << a[9] << endl;

mergesort(a, 0, 9);

cout << "mergesorted array: " << endl;

for(int i=0; i<9; i++)

cout << a[i] << " ";

cout << a[9] << endl;

return 0;

}

執行結果

排序演算法之歸併排序

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

排序演算法之歸併排序

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

排序演算法之歸併排序

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