我无法理解这个partition
方法。使用随机的 pivot 似乎不起作用,只有当我使用其中一个作为 pivot 时,它似乎才有效:
arr[left]
arr[right - 1]
arr[(left + right) / 2]
但是,我认为任何元素都应该有用。当我将其更改为arr[1]
之类的代码时代码停止工作......我是否误解了关于支点的事情?
以下是partition()
方法的代码:
public static int partition(int arr[], int left, int right) {
// Pick a pivot point. Can be any element.
int pivot = arr[(left + right) / 2];
while (left <= right) {
while (arr[left] < pivot) {
left++;
}
while (arr[right] > pivot) {
right--;
}
if (left <= right) {
swap(arr, left, right);
left++;
right--;
}
}
return left;
}
以下是完整的快速排序代码的链接:https://gist.github.com/anonymous/e1c74f2794ecb5b898ab
作为旁注,我还有点不确定为什么我们从left
方法返回partition()
。
答案 0 :(得分:4)
Quicksort中的枢轴应该从要分区的子阵列的元素中选择。因此,arr[i]
必须i
,left
和right
之间。如果arr[1]
或left > 1
right < 1
至于返回left
- partition
执行数组元素在left
到right
范围内的交换,以便在完成后,left
中的所有元素1}}(传递给方法的原始left
)到方法返回的left
- 1小于方法返回的left
中的所有元素到原始{ {1}}传递给该方法。这允许您对两个分区中的每个分区进行快速排序的递归调用。
该方法可以返回right
,这需要在实现中稍作修改:
而不是打电话
right
分区后,您将调用
if (left < index - 1) {
quickSort(arr, left, index - 1);
}
if (index < right) {
quickSort(arr, index, right);
}