Top-down Mergsort
里面有个问题一定要注意!在递归sort方法中:两个递归调用必须是:
sort(a, lo, mid);
sort(a, mid + 1, hi);
而不是!!
sort(a, lo, mid + 1);
sort(a, mid, hi);
为啥呢?因为如果用后一种情况的话如果lo=0, mid=1 =》 下一个递归调用中还是lo=0,mid=1
public class MergeSort {
private static int[] aux;
public static void main(String[] args) {
int[] arr = {13,4,5,6,8,9,5,8,96,17,23};
sort(arr);
String output = "";
for (int i:arr) {
output += i + ",";
}
System.out.println(output);
System.out.println(3 / 2);
}
private static void sort(int[] a) {
aux = new int[a.length];
sort(a, 0, a.length - 1);
}
private static void sort(int[] a, int lo, int hi) {
if (lo >=hi) {
return;
}
int mid = lo + (hi - lo) / 2;
/**
* Attention!!! Cannot write as:
* Don't do that: sort(a, lo, mid + 1);
* Don't do that: sort(a, mid, hi);
*/
sort(a, lo, mid);
sort(a, mid + 1, hi);
merge(a, lo, mid, hi);
}
private static void merge(int[] a, int lo, int mid, int hi) {
int i = lo, j = mid + 1;
for (int k = lo; k <= hi; k++) {
aux[k] = a[k];
}
for (int k = lo; k <= hi; k++) {
if (i > mid) {
a[k] = aux[j++];
}
else if (j > hi) {
a[k] = aux[i++];
}
else if (aux[i] > aux[j]) {
a[k] = aux[j++];
}
else {
a[k] = aux[i++];
}
}
}
}