原理:將序列兩兩分組,將序列歸併為[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...