十大排序算法-歸併排序

歸併排序(Merge Sort)

原理:採用遞歸思想,分而治之。將數組從中間分割成兩部分數組進行排序,其中左半部分和右半部分又遞歸式進行分割排序,直到分割後的數組只剩兩個元素,再逐級向上返回排序好的結果。

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

邏輯代碼

public class MergeSort {

    public static void main(String[] args) {
        int[] arr = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};
        sort(arr,0,arr.length-1);
        Utils.printArr(arr);
    }

    public static void sort(int[] arr, int left, int right) {
        if (left >= right) return;
        //分成兩半
        int mid = left + (right - left) / 2;
        //左邊排序
        sort(arr, left, mid);
        //右邊排序
        sort(arr, mid + 1, right);
        merge(arr, left, mid + 1, right);
    }

    public static void merge(int[] arr, int left, int mid, int right) {
        int[] temp = new int[right - left + 1];
        int i = left;//左邊數組開始位置
        int j = mid+1;//右邊數組開始位置
        int k = 0;  //新數組開始位置
        while (i <= mid && j <= right) {
            //如果左邊數組當前下標對應值 小於 左邊數組當前下標對應值,新數組賦值左邊下標當前值,否則賦值右邊下標當前值
            if (arr[i] <= arr[j]) {
                temp[k++] = arr[i++];
            } else {
                temp[k++] = arr[j++];
            }
        }
        // 把左邊剩餘的數移入數組
        while (i <= mid) temp[k++] = arr[i++];
        // 把右邊邊剩餘的數移入數組
        while (j <= right) temp[k++] = arr[j++];
        // 把新數組中的數覆蓋arr數組中的當前排序部分
        for (int m = 0; m < temp.length; m++) {
            arr[left + m] = temp[m];
        }

    }
}

2.演示圖:
演示圖片爲轉載,轉載地址:https://www.runoob.com/w3cnote_genre/algorithm
在這裏插入圖片描述

總結

時間複雜度(平均) 時間複雜度(最好) 時間複雜度(最壞) 空間複雜度 穩定性
O(nlogn O(nlogn) O(nlogn) O(n) 穩定
發佈了41 篇原創文章 · 獲贊 13 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章