遞迴和迭代兩種方式實現歸併排序(Java版)
阿新 • • 發佈:2018-12-23
遞迴版
package MergeSort;
import Utils.SortUtils;
/**
* 歸併排序遞迴版
* @author liguodong
*/
public class Demo02 {
public static void mergeSort(int[] a){
mSort(a, a, 0, a.length-1);
}
/**
*
* @param SR為待排序的資料
* @param TR1為排序之後的資料
* @param s
* @param t
*/
public static void mSort(int[] SR,int[] TR1, int s,int t){
int m;
int[] TR2 = new int[SR.length];
if(s==t){
TR1[s] = SR[s];
}else {
m = (s+t)/2;//4
mSort(SR, TR2, s, m);
mSort(SR, TR2, m+1, t);
merge(TR2, TR1, s, m, t);//0 4 8
}
}
//歸併兩個有序的陣列
/**
* @param SR 有兩個有序陣列
* @param TR 將SR的兩個有序數組合併為一個數組TR
* @param i
* @param m
* @param n
*/
public static void merge(int[] SR,int[] TR,int i,int m,int n){
int j,k,l;
//i(0~4) j(5~8)
for(j=m+1,k=i; i<=m && j<=n; k++){
if (SR[i]<SR[j]){
TR[k] = SR[i++];
}else{
TR[k] = SR[j++];
}
}
if(i<=m){
for (l = 0; l <= m-i ; l++) {
TR[k+l] = SR[i+l];
}
}
if(j<=n){
for (l = 0; l <= n-j; l++) {
TR[k+l] = SR[j+l];
}
}
}
public static void main(String[] args) {
int[] a = {2,3,5,4,1,6,9,8,7};
mergeSort(a);
SortUtils.printString(a);
}
}
複雜度分析
迭代版
package MergeSort;
import Utils.SortUtils;
/**
* 遞迴排序迭代版
* @author liguodong
*
*/
public class Demo03 {
public static void mergeSort(int[] a){
int[] TR = new int[a.length];//用於存放歸併結果
int k=1;//起始,子序列長度為1
while(k<a.length){
mergePass(a, TR, k, a.length);//將原先無序的資料兩兩歸併入TR
k = 2*k;//子序列長度加倍
mergePass(TR, a, k, a.length);//將TR中已經兩兩歸併的有序序列再歸併回陣列a
k = 2*k;//子序列長度加倍
}
}
public static void mergePass(int[] SR, int [] TR,int s,int len){
int i=0;
while (i < len-2*s+1) {//8
merge(SR,TR,i,i+s-1,i+2*s-1);//兩兩歸併
i=i+2*s;
}
//處理最後的尾數
//i=8
if(i< len-s+1){//9
merge(SR, TR, i, i+s-1, len-1);//歸併最後兩個序列
}else {
for (int j = i; j < len; j++) {//若最後只剩下單個子序列
TR[j] = SR[j];
}
}
}
public static void merge(int[] SR,int[] TR,int i,int m,int n){
int j,k,l;
//i(0~4) j(5~8)
for(j=m+1,k=i; i<=m && j<=n; k++){
if(SR[i]<SR[j]){
TR[k] = SR[i++];
}else{
TR[k] = SR[j++];
}
}
if(i<=m){
for (l = 0; l <= m-i ; l++) {
TR[k+l] = SR[i+l];
}
}
if(j<=n){
for (l = 0; l <= n-j; l++) {
TR[k+l] = SR[j+l];
}
}
}
public static void main(String[] args) {
int[] a = {2,3,5,4,1,6,9,8,7,10,20,45,32,28,44,31,55,43,23,21,23,21,33,21};
mergeSort(a);
SortUtils.printString(a);
}
}