4 6 2歸併排序及其兩種實現方式(詳解)

2021-10-08 20:19:04 字數 1794 閱讀 2486

原理:將序列兩兩分組,將序列歸併為[n/2]個組,組內單獨排序;排序後,將這些組再兩兩歸併,生成[n/4]個組,組內單獨排序,以此類推;直到只剩下乙個組。時間複雜度為o(nlogn).

例子

先分成,,,,對它進行排序

,,,,

接著合併 並 排序

,最後把這兩個也合併了

.歸併排序有兩種實現方法:

1.非遞迴

//歸併排序 非遞迴

#include

#include

#include

using namespace std;

const

int maxn =

100;

int n =10;

void

mergesort

(int a)

;void

merge

(int a,

int l1,

int r1,

int l2,

int r2)

;//這是主函式

intmain

(void);

mergesort

(x);

for(

int i =

0; i < n ; i++

)return0;

}//利用c++ algorithm裡的sort()

void

mergesort

(int a)

}}

2.遞迴

//歸併排序 遞迴

#include

#include

#include

using namespace std;

const

int maxn =

100;

int n =10;

void

mergesort

(int a,

int left,

int right)

;void

merge

(int a,

int l1,

int r1,

int l2,

int r2)

;int

main

(void);

mergesort

(x,0,9

);for(

int i =

0; i < n ; i++

)return0;

}//將left 到 right之間的資料進行歸併

void

mergesort

(int a,

int left,

int right)

}void

merge

(int a,

int l1 ,

int r1 ,

int l2 ,

int r2)

;while

(i + l1 <= r1 && j + l2 <= r2)

//因為是其中乙個放完,所以等號得取

else

}// printf("***x");

while

(i + l1 <= r1 )

//把長的那個陣列剩下的部分依次放入b中

while

(j + l2 <= r2 )

for(

int j =

0; j < k; j++

)}

歸併排序 MergeSort 兩種實現方式比較

前面我寫的歸併排序實現,雖然原理上沒什麼問題,但演算法實現不是很理想,今天沒什麼事情,重新優化了一下,這裡比較一下 1 第1種方式,我採用了輔助儲存來進行歸併,如下 private void mergesort1 int a,int is,int ie int ie1 is ie 2 int is2...

歸併排序 MergeSort 兩種實現方式比較

前面我寫的歸併排序實現,雖然原理上沒什麼問題,但演算法實現不是很理想,今天沒什麼事情,重新優化了一下,這裡比較一下 1 第1種方式,我採用了輔助儲存來進行歸併,如下 private void mergesort1 int a,int is,int ie int ie1 is ie 2 int is2...

歸併排序的實現方式

演算法思想 將兩個有序的陣列歸併成乙個更大的有序陣列。public class merge private static void sort comparable a,int low,int high 原地歸併的抽象方法 將乙個陣列變為有序 public static void merge comp...