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);
}
Il codice funziona ma ho difficoltà a capirlo.Comprendere come funziona l'ordinamento merge
capisco lo scopo di
if (hi <= lo) { return; }
ma non so cosa succede quando viene eseguito il ritorno.
Non capisco perché esista l'ultima funzione di unione. Se l'algoritmo si divide fino al
aux
è[3,5]
e voglio ordinare in ordine crescente, loelse if
confronterà con lo5 < 3
che passerà al resto e dovrebbe scambiare i 2 valori.
Edit: ho giocato un po 'con il debugger e per questo esempio (3 33 1 55 66 34 67 45 23) raggiunge la funzione di unione con i primi 2 valori. L'ultimo altro se confronta 33 < 3 e inserisce l'ultimo altro. Se questi valori sono nell'ordine corretto, qual è il punto di questa linea di codice? Dopo array [k] = aux [i ++]; viene eseguito il valore della matrice [0] è la stessa che è dispari perché aux [i ++] è array [1]
conosci il concetto di ricorsione? – adamliesko
Sì, so cos'è la Ricorsione. –
Ecco una spiegazione [attraverso il mezzo della danza] (https://www.youtube.com/watch?v=XaqR3G_NVoo). :) – biziclop