Я узнаю о слиянии сверху вниз, и я начинаю понимать рекурсивную часть. Я видел пару реализаций, где слияние было выполнено с помощью цикла while.Наверху down mergesort. Операция слияния нечеткая
Однако в реализации ниже операция слияния отличается, и не совсем ясно, как она работает. Это, кажется, просто сравнивая индексы, а не фактические элементы (в отличие от других реализаций я видел)
private void merge(int[] aux, int lo, int mid, int hi) {
for (int k = lo; k <= hi; k++) {
aux[k] = theArray[k];
}
int i = lo, j = mid+1;
for (int k = lo; k <= hi; k++) {
if (i > mid) {
theArray[k] = aux[j++];
}
else if (j > hi) {
theArray[k] = aux[i++];
}
else if (aux[j] < aux[i]) {
theArray[k] = aux[j++];
}
else {
theArray[k] = aux[i++];
}
}
}
private void sort(int[] aux, int lo, int hi) {
if (hi <= lo)
return;
int mid = lo + (hi - lo)/2;
sort(aux, lo, mid);
sort(aux, mid + 1, hi);
merge(aux, lo, mid, hi);
}
public void sort() {
int[] aux = new int[theArray.length];
sort(aux, 0, aux.length - 1);
}
Приведенный выше код предполагает глобальную переменную theArray
существует.
Не должно быть int [] aux = new int [theArray.Length]; (без -1), а затем сортировать (aux, 0, theArray.Length-1)? – rcgldr