4 归并排序 merge sort
4.1 原理
需要将一个数组排序, 可以先 (递归地) 将它分成两半分别排序, 然后将结果归并起来.
4.1.1 优点
能够保证将任意长度 N N N 的数组排序所需时间和 N log N N\log N NlogN 成正比.
4.1.2 缺点
所需的额外空间和 N N N 成正比.
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 性能分析
比较次数: N log N N\log N NlogN.
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));
}
}
}
}