private void merge(int[] array, int[] aux, int low, int mid, int hi) {
int i = low, j = mid + 1, k;
for (k = low; k <= hi; k++) {
aux[k] = array[k];
}
for (k = low; k <= hi; k++) {
if (i > mid) {
array[k] = aux[j++];
} else if (j > hi) {
array[k] = aux[i++];
} else if (aux[j] < aux[i]) {
array[k] = aux[j++];
} else /* if (aux[i] <= aux[j] */ {
array[k] = aux[i++];
}
}
}
private void sort(int[] array, int[] aux, int lo, int hi) {
if (hi <= lo) {
return;
}
int mid = lo + (hi - lo)/2;
sort(array, aux, lo, mid);
sort(array, aux, mid + 1, hi);
merge(array, aux, lo, mid, hi);
}
public void mergeSort() {
int aux[] = new int[n];
sort(ar, aux, 0, n - 1);
}
Kod działa, ale mam problem z jego zrozumieniem.Opis sposobu sortowania scalania działa
Rozumiem cel
if (hi <= lo) { return; }
ale nie wiem, co się dzieje, gdy zwrot jest wykonywany.
Nie rozumiem, dlaczego ostatni element w funkcji scalania istnieje. Jeśli algorytm się rozdzieli, aż
aux
jest[3,5]
i chcę posortować rosnąco,else if
porówna5 < 3
, który przeskoczy do innego i powinien wymienić 2 wartości.
Edycja: odtwarzane nieco z debugera i w tym przykładzie (3 33 1 55 66 34 67 45 23) osiąga funkcję scalania z pierwszych 2 wartości. Ostatni, jeśli porównuje 33 < 3 i wprowadza ostatni. Jeśli te wartości są we właściwej kolejności, jaki jest punkt tego wiersza kodu? Po tablicy [k] = aux [i ++]; wykonywany jest wartość tablica [0] jest taki sam, co jest dziwne, ponieważ AUX [i ++] jest tablica [1]
Czy znasz pojęcie Rekursji? – adamliesko
Tak, wiem, czym jest rekursja. –
Oto wyjaśnienie [za pośrednictwem tańca] (https://www.youtube.com/watch?v=XaqR3G_NVoo). :) – biziclop