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 çalışıyor ancak bunu anlayamıyorum.Birleştirme türünün nasıl çalıştığını anlama
Ben
if (hi <= lo) { return; }
amacını anlıyorum ama dönüş yürütüldüğünde ne olur bilmiyorum.
Neden birleştirme işlevindeki son başka neden var anlamıyorum. Algoritma
aux
[3,5]
olana kadar bölme yapıyorsa ve ben artan sıralamak istiyorum,else if
,5 < 3
karşılaştıracak ve bu, diğerine atlayacak ve 2 değeri değiştirmelidir.
Düzenleme: ayıklayıcı ile ve bu örnekte (3 33 1 55 66 34 67 45 23) ilk 2 değerleri ile birleştirme işlevini ulaştığı için biraz olmuştur. Sonuncu ise, 33 < 3'ü karşılaştırır ve sonuncuya girer. Eğer bu değerler doğru sırada ise, bu kod satırının noktası nedir? Diziden sonra [k] = aux [i ++]; dizinin değerini yürütülür [0] aux için [i ++] sorunu daha küçük alt problemlere ayrılmıştır sort
yöntemde dizi [1]
Özyineleme kavramını biliyor musunuz? – adamliesko
Evet, Recursion'un ne olduğunu biliyorum. –
İşte bir açıklama [dans ortamı aracılığıyla] (https://www.youtube.com/watch?v=XaqR3G_NVoo). :) – biziclop