public static void merge(Comparable[] a, Comparable[] aux, int lo, int mid, int hi) {
// precondition: a[lo .. mid] and a[mid+1 .. hi] are sorted subarrays
assert isSorted(a, lo, mid);
assert isSorted(a, mid+1, hi);
// copy to aux[]
for (int k = lo; k <= hi; k++) {
aux[k] = a[k];
}
// merge back to a[]
int i = lo, j = mid+1;
for (int k = lo; k <= hi; k++) {
if (i > mid) a[k] = aux[j++];
else if (j > hi) a[k] = aux[i++];
else if (less(aux[j], aux[i])) a[k] = aux[j++];
else a[k] = aux[i++];
}
// postcondition: a[lo .. hi] is sorted
assert isSorted(a, lo, hi);
}
private static void sort(Comparable[] a, Comparable[] aux, int lo, int hi) {
if (hi <= lo) return;
int mid = lo + (hi - lo) / 2;
sort(a, aux, lo, mid);
sort(a, aux, mid + 1, hi);
merge(a, aux, lo, mid, hi);
}
我明白merge的执行过程,不明白sort的执行过程。
我实在是不明白,这部分算法的执行路径是什么?
我的思路是,比如数组a的长度是15,那么第一次调用sort调用的是sort(a,aux,0,15),程序执行到 sort(a, aux, lo, mid)时,又会再次调用这个方法,此时sort(a,aux,0,7),接下来sort(a,aux,0,3),sort(a,aux,0,1),sort(a,aux,0,0),。那么问题来了,接下来,不是一直执行if (hi <= lo) return;这条语句吗?
而且,这个方法执行过程中,是怎么反复执行sort ,merge语句的?