1. 程式人生 > >排序演算法之 歸併排序

排序演算法之 歸併排序

這一篇要總結的是歸併排序,這也是七大排序的最後一種排序演算法。

首先來看一下歸併排序(Merge Sort) 的基本原理。它的原理是假設初始序列有n個元素,則可以看成是n個有序的子序列,每個子序列的長度為1,然後兩兩歸併,得到n/2個長度為2或1的有序子序列;再兩兩歸併,…… ,如此重複,直至得到一個長度為n的有序序列為止,這種排序方法就稱為歸併排序。

1、歸併排序的示意圖

下面用示意圖來說明歸併排序的過程:

圖一:

圖二:

2、歸併排序的程式碼

MergeSort.java 

public class MergeSort {
    public static void main(String[] args) {
        int[] list = {50, 10, 90, 30, 70};
        System.out.println("************歸併排序************");
        System.out.println("排序前:");
        display(list);
        System.out.println("");

        System.out.println("排序後:");
        mergeSort(list, 0, list.length - 1);
        display(list);
    }

    /**
     * 歸併排序演算法
     *
     * @param list     待排序的列表
     * @param tempList 臨時列表
     * @param head     列表開始位置
     * @param rear     列表結束位置
     */
    public static void mergeSort(int[] list, int head, int rear) {
        if (head < rear) {
            // 取分割位置
            int middle = (head + rear) / 2;
            // 遞迴劃分列表的左序列
            mergeSort(list, head, middle);
            // 遞迴劃分列表的右序列
            mergeSort(list,  middle + 1, rear);
            // 列表的合併操作
            merge(list, head, middle + 1, rear);
        }
    }

    /**
     * 合併操作(列表的兩兩合併)
     *
     * @param list
     * @param tempList
     * @param head
     * @param middle
     * @param rear
     */
    public static void merge(int[] list, int head, int middle, int rear) {  
        
           int[] temp = new int[high-low+1];
           int i= low;
           int j = mid+1;
           int k=0;
          // 把較小的數先移到新陣列中
            while(i<=mid && j<=high){
            if(a[i]<a[j]){
               temp[k++] = a[i++];
            }else{
               temp[k++] = a[j++];
            }
           }
            // 把左邊剩餘的數移入陣列
       while(i<=mid){
            temp[k++] = a[i++];
         }
          // 把右邊邊剩餘的數移入陣列
         while(j<=high){
             temp[k++] = a[j++];
        }
         // 把新陣列中的數覆蓋nums陣列
        for(int x=0;x<temp.length;x++){
            a[x+low] = temp[x];
        }
    }

    /**
     * 遍歷列印
     */
    public static void display(int[] list) {
        System.out.println("********展示開始********");
        if (list != null && list.length > 0) {
            for (int num :
                    list) {
                System.out.print(num + " ");
            }
            System.out.println("");
        }
        System.out.println("********展示結束********");
    }
}

執行結果: