java算法 -- 歸併排序

歸併排序:java

先分解再合併。數組

分解:分爲若干個子序列,每一個子序列是有序的。緩存

合併:而後再把有序子序列合併爲總體有序序列。code

public class MergeSortTest {


    public static void main(String[] args) {
        int[] array = {1, 2, 5, 41, 7, 11, 13, 17, 59, 19, 23, 29, 31, 37, 43, 47, 53};
        int[] hillSortArrays = mergeSort(array);
        for (int s : hillSortArrays) {
            System.out.print(s + " ");
        }
    }

    /**
     * 歸併排序
     *
     * @param arrays 要排序的數組
     * @return 排序後的數組
     */
    private static int[] mergeSort(int[] arrays) {
        return sort(arrays, 0, arrays.length - 1);
    }

    private static int[] sort(int[] data, int left, int right) {
        if (left >= right) {
            return data;
        }
        // 找出中間索引
        int center = (left + right) / 2;
        // 對左邊數組進行遞歸
        sort(data, left, center);
        // 對右邊數組進行遞歸
        sort(data, center + 1, right);
        // 合併
        return merge(data, left, center, right);
    }

    /**
     * 將兩個數組進行歸併,歸併前面 2 個數組已有序,歸併後依然有序
     *
     * @param data 數組對象
     * @param left 左數組的第一個元素的索引
     * @param center 左數組的最後一個元素的索引,center+1 是右數組第一個元素的索引
     * @param right
     * @return 排序後的數組
     */
    private static int[] merge(int[] data, int left, int center, int right) {
        // 臨時數組
        int[] tmpArr = new int[data.length];
        // 右數組第一個元素索引
        int mid = center + 1;
        // third 記錄臨時數組的索引
        int third = left;
        // 緩存左數組第一個元素的索引
        int tmp = left;
        while (left <= center && mid <= right) {
            // 從兩個數組中取出最小的放入臨時數組
            if (data[left] <= data[mid]) {
                tmpArr[third++] = data[left++];
            } else {
                tmpArr[third++] = data[mid++];
            }
        }
        // 剩餘部分依次放入臨時數組(實際上兩個 while 只會執行其中一個)
        while (mid <= right) {
            tmpArr[third++] = data[mid++];
        }
        while (left <= center) {
            tmpArr[third++] = data[left++];
        }
        // 將臨時數組中的內容拷貝回原數組中
        // (原 left-right 範圍的內容被複制回原數組)
        while (tmp <= right) {
            data[tmp] = tmpArr[tmp++];
        }

        return data;
    }
}
相關文章
相關標籤/搜索