1. 程式人生 > >排序--MergeSort 歸並排序?

排序--MergeSort 歸並排序?

超出 sed 2個 src ret class pla -1 spl

  MergeSort ‘s implementation

  MergetSort 的中心思想就是分治思想,通過解決每一個小問題來解決大問題

  假設你有2個已經排好序的數組

  數組[ 4 ][ 8 ] 和 數組[ 5 ][ 7 ] 進行排序

  4 是第一個數組最小的值 和 第二個數組最小的值5 進行比較 4 < 5 所以最小的元素是4

  排完第一個元素後是[ 4 ][ null ][ null ][ null ]

  接著排第二個元素, 8 和 5 比較。5 比較小

  所以是 [ 4 ][ 5 ][ null ][ null ],接著 第一個數組最小的值8 和第二個數組最好的值7 比較。 7 < 8

  所以變成 [ 4 ][ 5 ][ 7 ][ 8 ]。

  所以問題的關鍵就是先把2個 數組分別排序了。再merge到一個大的數組中。下面盜用一下別人的圖。嘎嘎嘎

    技術分享

  mergeSort的復雜度為NLgN。相當快的算法。並且是stable

  下面給出具體的實現

  

技術分享
    //Time : N log(N) & wasting space that proportional to N
    public static void sort(Comparable[] a) {
        sort(a, new Comparable[a.length], 0, a.length - 1);
    }
    
    
//mid 的左右都已經是有序的了, //這個是merge方法 //a 和輔助 數組的長度需要一致 /** i j * [] [] [] [ ] [] * low mid hi */ private static void sort(Comparable[] a, Comparable[] aux, int low, int hi) { if (low >= hi) return; int
middle = low + (hi - low) / 2; sort(a, aux, low, middle); //sort left sort(a, aux, middle + 1, hi); // sort right merge(a, aux, low, middle, hi); } /** i j * [ ] [ ] [ ] [ ] [ ] * low mid hi */ private static void merge(Comparable[] a, Comparable[] aux,int low, int middle, int hi) { int i = low; int j = middle + 1; for (int k = low; k <= hi; k++) aux[k] = a[k]; //把元素復制到輔助數組上 for (int k = low; k <= hi; k++) { //前面2個判斷條件一定要在前面。 //要不然下面比較的時候 會出現空指針異常 //因為已經有可能j 已經超出了hi的大小 if (i > middle) a[k] = aux[j++]; else if (j > hi) a[k] = aux[i++]; else if (less(aux[i],aux[j])) a[k] = aux[i++]; // else a[k] = aux[j++]; } }
merge sort

https://github.com/Cheemion/algorithms/blob/master/src/com/algorithms/sort/MergeSort.java

排序--MergeSort 歸並排序?