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);
}
代码有效,但我无法理解它。
我理解
的目的if (hi <= lo) {
return;
}
但我不知道执行返回时会发生什么。
我不明白为什么合并函数中的最后一个存在。如果算法在aux
为[3,5]
并且我想要升序排序,那么else if
会比较5 < 3
,它会跳转到其他地方,它应该交换2值。
编辑:我使用调试器进行了一些操作,对于此示例(3 33 1 55 66 34 67 45 23),它使用前2个值到达合并功能。最后的其他如果比较33&lt; 3并输入最后一个。如果这些值的顺序正确,这行代码的重点是什么?在数组[k] = aux [i ++]之后;执行时,array [0]的值是相同的,因为aux [i ++]是数组[1]
答案 0 :(得分:3)
在sort
方法中,问题分为较小的子问题。当要排序的范围只有一个或零宽时,无需执行任何操作,并且可以关闭该方法。这是因为单独的一个元素按定义排序。它是递归like m0skit0 said的停止条件。
此算法中未交换元素。该方法尝试合并两个排序的数组。有两个索引i
和j
。当i
到达中间时,右侧部分中的所有元素都将添加到结果数组中。如果j
到达右边框,则左侧部分的所有元素都会添加到结果中。这是前两种情况
现在在最后两种情况下,算法试图找出由i
和j
索引的当前元素中的哪一个是最小值,并将其添加到结果数组中。在第三种情况下,j
处的元素较小并添加到结果数组中。在第四种情况下,选择i
处的元素。