4 歸併排序 merge sort
4.1 原理
需要將一個數組排序, 可以先 (遞歸地) 將它分成兩半分別排序, 然後將結果歸併起來.
4.1.1 優點
能夠保證將任意長度 的數組排序所需時間和 成正比.
4.1.2 缺點
所需的額外空間和 成正比.
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 性能分析
比較次數: .
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));
}
}
}
}