1. 程式人生 > 其它 >java排序之歸併排序

java排序之歸併排序

歸併排序

一、概念及其介紹

歸併排序(Merge sort)是建立在歸併操作上的一種有效、穩定的排序演算法,該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱為二路歸併。

二、適用說明

當有 n 個記錄時,需進行 logn 輪歸併排序,每一輪歸併,其比較次數不超過 n,元素移動次數都是 n,因此,歸併排序的時間複雜度為 O(nlogn)。歸併排序時需要和待排序記錄個數相等的儲存空間,所以空間複雜度為 O(n)。

歸併排序適用於資料量大,並且對穩定性有要求的場景。

class Solution {
    public int[] sortArray(int[] nums) {
        int[] result = new int[nums.length];
        sort(nums, 0, nums.length-1, result);
        return result;
    }

    public void sort(int [] nums, int l, int r, int [] result) {
        if(l>=r) {
            return;
        }
        
int mid = (l + r) / 2; sort(nums, l, mid, result); sort(nums, mid + 1, r, result); merge(nums, l, r, mid, result); } public void merge(int [] nums, int l, int r, int mid, int [] result) { int i = l; int j = mid + 1; int k; for(k = l;k<= r;k++) {
if(i>mid) { result[k] = nums[j]; j++; } else if(j>r) { result[k] = nums[i]; i++; } else if(nums[i] < nums[j]) { result[k] = nums[i]; i++; } else { result[k] = nums[j]; j++; } } for(int p = l; p<= r; p++) { nums[p] = result[p]; } } }

注意最後:

for(int p = l; p<= r; p++) {
            nums[p] = result[p];
        }

需要將排序後的拷貝到原陣列中,這樣才能滿足後面的遞迴合併的是兩個已經排好序的陣列。

參考:https://www.runoob.com/data-structures/merge-sort.html