合併排序(merge sort)是又一類不同的排序方法,合併的含義就是將兩個或兩個以上的有序資料序列合併成乙個新的有序資料序列,因此它又叫歸併演算法。它的基本思想就是假設陣列a有n個元素,那麼可以看成陣列a是又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)
歸併演算法如下:
#includeusing namespace std;
typedef int rectype;//要排序元素型別
void merge(rectype *r,int low,int m,int high)
while(i<=m&&j<=high) //兩子檔案非空時取其小者輸出到r1[p]上
while(i<=m) //若第1個子檔案非空,則複製剩餘記錄到r1中
while(j<=high) //若第2個子檔案非空,則複製剩餘記錄到r1中
for(p=0,i=low;i<=high;p++,i++)
}
void mergesort(rectype r,int low,int high)
{
//用分治法對r[low..high]進行二路歸併排序
int mid;
if(low
歸併排序法
之前覺得這個很難,後來看了一些部落格,理解了之後總算是懂了。算是之前的補充。並且今天筆試有排序演算法,正好做個記錄,加深映象 歸併排序的核心是分而治之,先分開,再兩兩合併,合併的時候調整順序。例如 待排序序列 4 8 5 3 9 6 2 4 第一次分 4 8 5 3 9 6 2 4 第二次分 4 8...
歸併排序法
void guibing int r,int temp,int s,int m,int t 陣列r的兩個連續的有序列,從第s到第m個,從第m 1到第t個,合併產生乙個有序列 從第s到第t else temp k r j while i m while j t 將剩餘的插入,只會進行兩個while中的...
歸併排序法
1 doctype html 2 html 3 head 4 meta charset utf 8 5 meta name viewport content width device width 6 title 歸併排序法 title 7head 8 body 9歸併排序是一種分治演算法,其思想是將...