1. 程式人生 > >排序演算法(七)——歸併排序

排序演算法(七)——歸併排序

歸併排序(Merge Sort)演算法就是將多個有序資料表合併成一個有序資料表。如果參與合併的只有兩個有序表,則稱為二路合併。對於一個原始的待排序序列,往往可以通過分割的方法來歸結為多路合併排序。

合併排序演算法的運作如下:

(1)首先將含有n個結點的待排序資料序列看成9個長度為1的有序子表。

(2)將這些有序子表依次兩兩合併,得到長度為2的若干有序子表。

(3)然後再對這些子表進行兩兩合併,得到長度為4的若干有序子表....

(3)不斷重複上述過程,直到子表長度為n,合併成為一整個序列,也就完成了整個排序過程。

package cn.kimtian.sort;

import java.util.Arrays;

/**
 * 歸併排序
 *
 * @author kimtian
 */
public class MergeSort {
    public static void main(String[] args) {
        int[] arr = {1, 3, 6, 7, 8, 0, 7, 4, 2, 1};
        mergeSort(arr, 0, arr.length - 1);
        System.out.println(Arrays.toString(arr));
    }

    public static void mergeSort(int[] arr, int low, int hight) {
        int middle = (hight + low) / 2;
        //遞迴的結束條件
        if (low < hight) {
            //處理左邊
            mergeSort(arr, low, middle);
            //處理右邊
            mergeSort(arr, middle + 1, hight);
            //歸併
            merge(arr, low, middle, hight);
        }
    }

    /**
     * 合併
     */
    public static void merge(int[] arr, int low, int middle, int high) {
        //用於儲存歸併後的臨時陣列
        int[] temp = new int[high - low + 1];
        //記錄第一個陣列中需要遍歷的下標
        int i = low;
        //記錄第二個陣列中需要遍歷的下標
        int j = middle + 1;
        //用於記錄在臨時陣列中存放的下標
        int index = 0;
        //遍歷兩個陣列,取出小的數字放入臨時檔案中
        while (i <= middle && j <= high) {
            //如果第一個陣列的最小值,小於等於第二個陣列的最小值,則把i放入臨時陣列中
            if (arr[i] <= arr[j]) {
                temp[index] = arr[i];
                i++;
            }
            //第二個陣列的資料更小,把第二個陣列的資料j放入臨時陣列中
            else {
                temp[index] = arr[j];
                j++;
            }
            index++;
        }
        //處理多餘的資料
        while (j <= high) {
            temp[index] = arr[j];
            j++;
            index++;
        }
        while (i <= middle) {
            temp[index] = arr[i];
            i++;
            index++;
        }

        //把臨時陣列中的資料重新存入原陣列
        for (int k = 0; k < temp.length; k++) {
            arr[k + low] = temp[k];
        }
    }
}