歸併排序(合併排序)

2021-07-10 19:01:46 字數 1759 閱讀 7764

合併排序(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)

歸併演算法如下:

#include

#include

typedef

intrectype;

//要排序元素型別

void

merge(rectype *r,

intlow,

intm,

inthigh)  

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,

intlow,

inthigh)  

}  void

main()  

; //這裡對8個元素進行排序

intlow=0,high=6;                   

//初始化low和high的值

printf(

"before merge sort: "

);  

for(

inti=low;i<=high;i++)  

printf(

"/n"

);  

mergesort(a,low,high);  

printf(

"after merge sort:  "

);  

for( i=low;i<=high;i++)  

printf(

"/n"

);  

}   

歸併排序(合併排序)

題目 要求氣泡排序的交換次數,也就是求逆序數的個數。在乙個排列中如果有兩個數的排序和所規定的排序規則相反,則這兩個數是乙個逆序。乙個排列中的逆序的總數就是這個排列的逆序數。用歸併排序,求逆序數的個數。poj 2299 這道題充分印證了,即使merge本身可能用的不多,但分冶的思想卻是無所不在 inc...

合併排序(歸併)

mergesort.h include using std vector class mergesort mergesort.cpp include stdafx.h include using std cout using std endl include using std vector inc...

排序(2)歸併排序(遞迴 合併排序)

用到遞迴 合併,所以叫歸併。public static int data 遞迴 param temp 臨時陣列 param sindex 開始索引 param eindex 結束索引 private static void recursion int temp,int sindex,int eind...