算法第四版 第二章 歸併排序

4 歸併排序 merge sort

4.1 原理

需要將一個數組排序, 可以先 (遞歸地) 將它分成兩半分別排序, 然後將結果歸併起來.

4.1.1 優點

能夠保證將任意長度 NN 的數組排序所需時間和 NlogNN\log N 成正比.

4.1.2 缺點

所需的額外空間和 NN 成正比.

4.2 歸併實現

public static void merge(Comparable[] a, int lo, int mid, int hi) {
  int i=lo, j = mid+1;
  for (int k=0; k<=hi; k++) { aux[k] = a[k]; }
  for (int k=0; k<=hi; k++) {
    if (i>mid) 											{ 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++]; }
  }
}

4.3 自頂向下的歸併排序

4.3.1 實現

public class Merge {
  private static Comparable[] aux;
  
  public static void sort(Comparable[] a) {
    aux = new Comparable[a.length];
    sort(a, 0, a.length-1);
  }
  
  public static void sort(Comparable[] a, lo, hi) {
    if (lo >= hi) { return; }
    int mid = lo + (hi - lo)/2;
    sort(a, lo, mid);
    sort(a, mid+1, hi);
    merge(a. lo, mid, hi);
  }
}

4.3.2 性能分析

比較次數: NlogNN\log N.

4.4 自底向上的歸併排序

4.4.1 實現

public class MergeBU {
  private static Comparable[] aux;
  public static void sort(Comparable[] a) {
    int N = a.length;
    aux = new Comparable[N];
    for (int sz=1; sz<N; sz = sz+sz) {
      for (int lo=0; lo<N-sz; lo+=sz+sz) {
        merge(a, lo, lo+sz-1, Math.min(lo+sz+sz-1, N-1));
      }
    }
  }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章