歸并排序

概述

如果一個數(shù)組有n個數(shù)據(jù),則可以把這個數(shù)組看作n個有序的子序列,每個子序列的長度為1,然后兩兩歸并,就能得到[n/2]個長度為2或1的子序列,再不斷地兩兩歸并,直到得到一個長度為n的有序數(shù)組。
這種排序方法稱為2路歸并排序

遞歸,java實(shí)現(xiàn)

public class MergeSort {
    public static void main(String[] args) {
        int[] array = {98, 21, 62, 48, 33, 6, 55, 17};
        System.out.print("MergeSort\n");
        printArray(array);
        System.out.print("start:\n");
        mergeSort(array, 0, array.length - 1);
        System.out.print("end:\n");
    }

    static void mergeSort(int[] arr, int low, int high) {
        int mid = (low + high) / 2;
        if (low < high) {
            mergeSort(arr, low, mid);
            mergeSort(arr, mid + 1, high);
            merge(arr, low, mid, high);
        }
    }

    static void merge(int[] arr, int low, int mid, int high) {
        //temp數(shù)組用于暫存合并的結(jié)果
        int[] temp = new int[high - low + 1];
        //左半邊的指針
        int i = low;
        //右半邊的指針
        int j = mid+1;
        //合并后數(shù)組的指針
        int k = 0;

        //將記錄由小到大地放進(jìn)temp數(shù)組
        for(; i <= mid && j <= high; k++)
        {
            if(arr[i] < arr[j])
                temp[k] = arr[i++];
            else
                temp[k] = arr[j++];
        }

        //接下來兩個while循環(huán)是為了將剩余的(比另一邊多出來的個數(shù))放到temp數(shù)組中
        while(i <= mid)
            temp[k++] = arr[i++];

        while(j <= high)
            temp[k++] = arr[j++];

        //將temp數(shù)組中的元素寫入到待排數(shù)組中
        for(int l = 0; l < temp.length; l++)
            arr[low + l] = temp[l];

        printArray(arr);

    }

    static void printArray(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.print("\n");
    }
}

排序效果

MergeSort
98 21 62 48 33 6 55 17 
start:
21 98 62 48 33 6 55 17 
21 98 48 62 33 6 55 17 
21 48 62 98 33 6 55 17 
21 48 62 98 6 33 55 17 
21 48 62 98 6 33 17 55 
21 48 62 98 6 17 33 55 
6 17 21 33 48 55 62 98 
end:

復(fù)雜度

時(shí)間復(fù)雜度: O(nlogn)
空間復(fù)雜度: O(n+nlogn)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,354評論 0 2
  • 數(shù)據(jù)結(jié)構(gòu)與算法--歸并排序 歸并排序 歸并排序基于一種稱為“歸并”的簡單操作。比如考試可能會分年級排名和班級排名,...
    sunhaiyu閱讀 996評論 0 6
  • 歸并排序 所謂歸并,就是將兩個或兩個以上的有序表合并成一個新的有序表。如下圖所示,有兩個已經(jīng)排好序的有序表A[1]...
    JackChen1024閱讀 2,461評論 0 4
  • 一、 單項(xiàng)選擇題(共71題) 對n個元素的序列進(jìn)行冒泡排序時(shí),最少的比較次數(shù)是( )。A. n ...
    貝影閱讀 9,426評論 0 10
  • 昨天陰雨淅瀝,我和宋老師一起吃飯的時(shí)候隨便叨叨,居然把本該傷感的餞別情緒渲染的有點(diǎn)不正經(jīng)。年后就回老家的宋老師還是...
    杜爾西閱讀 963評論 0 0

友情鏈接更多精彩內(nèi)容