自顶向下归并排序:
public class MergeTOP {
private static void sort(int[] 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);
}
public static void merge(int[] a, int lo, int mid, int hi) {
int[] ca = new int[a.length];
for (int i = 0; i < a.length; i++) {
ca[i] = a[i];
}
mid = lo + (hi - lo) / 2;
int p1 = lo;
int p2 = mid + 1;
for (int i = lo; i <= hi; i++) {
if(p2 > hi) a[i] = ca[p1++];
else if(p1 > mid) a[i] = ca[p2++];
else if(ca[p1] < ca[p2]) a[i] = ca[p1++];
else a[i] = ca[p2++];
}
}
public static void sort(int[] a) {
int[] ca = new int[a.length];
sort(a, 0, a.length - 1);
}
public static void main(String[] args) {
int[] a = {
12,78,56,14,95,30,75,10,29,55,10,96,11};
sort(a);
System.out.println(Arrays.toString(a));
}
}
[10, 10, 11, 12, 14, 29, 30, 55, 56, 75, 78, 95, 96]