归并排序
1,自顶向下归并排序
详细代码参见MergeSort.java
public static void sort(String[] a) {
aux = new Comparable[a.length];
sort(a, 0, a.length - 1);
}
private static void sort(Comparable[] a, int lo, int hi) {
if (hi <= lo)
return;
int mid = lo + (hi - lo) / 2;
sort(a, lo, mid);
sort(a, mid + 1, hi);
merge(a, lo, mid, hi);
}
private static void merge(Comparable[] a, int lo, int mid, int hi) {
for (int i = lo; i <= hi; i++) {
aux[i] = a[i];
}
int loIndex = lo;
int hiIndex = mid + 1;
for (int k = lo; k <= hi; k++) {
if (loIndex > mid)
a[k] = aux[hiIndex++];
else if (hiIndex > hi)
a[k] = aux[loIndex++];
else if (SortExample.less(aux[hiIndex], aux[loIndex]))
a[k] = aux[hiIndex++];
else
a[k] = aux[loIndex++];
}
}
2,自底向上归并排序
详细代码参见MergeBUSort.java
private static Comparable[] aux;
public static void sort(String[] a) {
aux = new Comparable[a.length];
int N = a.length;
for (int size = 1; size < N; size += size) {
for (int i = 0; i < N - size; i += size + size) {
merge(a, i, i + size - 1, Math.min(i + size + size - 1, N - 1));
}
}
}
private static void merge(Comparable[] a, int lo, int mid, int hi) {
for (int i = lo; i <= hi; i++) {
aux[i] = a[i];
}
int loIndex = lo;
int hiIndex = mid + 1;
for (int k = lo; k <= hi; k++) {
if (loIndex > mid)
a[k] = aux[hiIndex++];
else if (hiIndex > hi)
a[k] = aux[loIndex++];
else if (SortExample.less(aux[hiIndex], aux[loIndex]))
a[k] = aux[hiIndex++];
else
a[k] = aux[loIndex++];
}
}