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);
}
Mã hoạt động nhưng tôi không hiểu.Hiểu cách sắp xếp hợp nhất hoạt động
tôi hiểu mục đích của
if (hi <= lo) { return; }
nhưng tôi không biết những gì sẽ xảy ra khi lợi nhuận được thực thi.
Tôi không hiểu tại sao người cuối cùng khác trong hàm hợp nhất tồn tại. Nếu thuật toán tách ra cho đến khi
aux
là[3,5]
và tôi muốn sắp xếp tăng dần, thìelse if
sẽ so sánh5 < 3
sẽ chuyển sang giá trị khác và nó sẽ trao đổi 2 giá trị.
Chỉnh sửa: Tôi đã chơi một chút với trình gỡ lỗi và cho ví dụ này (3 33 1 55 66 34 67 45 23) nó đạt đến hàm kết hợp với 2 giá trị đầu tiên. Người cuối cùng khác nếu so sánh 33 < 3 và nhập người khác cuối cùng. Nếu các giá trị này theo thứ tự đúng thì điểm của dòng mã này là gì? Sau mảng [k] = aux [i ++]; được thực hiện giá trị của mảng [0] là như nhau mà là số lẻ vì aux [i ++] là mảng [1]
bạn có quen với khái niệm Đệ quy không? – adamliesko
Vâng, tôi biết Recursion là gì. –
Đây là giải thích [thông qua phương tiện khiêu vũ] (https://www.youtube.com/watch?v=XaqR3G_NVoo). :) – biziclop