随机数据透视无法快速排序

时间:2016-02-09 09:52:42

标签: java algorithm sorting quicksort

我无法理解这个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()

1 个答案:

答案 0 :(得分:4)

Quicksort中的枢轴应该从要分区的子阵列的元素中选择。因此,arr[i]必须ileftright之间。如果arr[1]left > 1

,则无法选择right < 1

至于返回left - partition执行数组元素在leftright范围内的交换,以便在完成后,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);
    }