1. 程式人生 > >遞迴和迭代兩種方式實現歸併排序(Java版)

遞迴和迭代兩種方式實現歸併排序(Java版)

遞迴版

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);
    }
}