网上关于 Quicksort (用Java)的很多例子都接近于此:
private void quicksort(int low, int high) {
int i = low, j = high;
int pivot = numbers[low + (high-low)/2];
while (i <= j) {
while (numbers[i] < pivot) {
i++;
}
while (numbers[j] > pivot) {
j--;
}
if (i <= j) {
exchange(i, j);
i++;
j--;
}
}
if (low < j)
quicksort(low, j);
if (i < high)
quicksort(i, high);
}
我感到困惑的是为什么会有这些平等检查:
1)while (i <= j)
而不是while (i < j)
2)if (i <= j)
而不是if (i < j)
是否有任何相等的边缘情况?根据我的理解,如果我们有if(i == j)
,那么我们基本上会用相同的值交换相同的值。
任何人都可以为我解决这个难题吗?
答案 0 :(得分:6)
假设条件被i < j
替换。
让我们看看数组会发生什么:
5,4,3,2,1
while循环将以i = 2
和j = 2
终止,而我们将重叠调用函数quicksort,这些调用将:
quicksort(0,2) and quicksort(2,4)
如果我们确实有这个条件i<=j
,那么循环将以i = 4
和j = 1
结束,现在我们将调用:
quicksort(0,1) and quicksort(3,4)
这是正确的电话。
所以基本上你是对的,交换相同的元素是没有意义的,但是代码的作者必须省略它,以避免在我等于j时需要添加一个你不需要交换的额外条件/强>