快速帮助 - 分区

时间:2017-03-23 03:59:28

标签: java quicksort

我正在迭代地实现我自己的快速排序并使用递归。

第一个分区很好,其中枢轴右侧的数字大于左侧,而左侧的数字小于。

但是我的分区似乎没有分区右侧而只分区左侧。

int[] data = {3,5,2,7,11,9,1,88,22};

public void qSort(int[] data, int left, int right){
    int pivot = partition(data,left,right);
    pivot = partition(data,pivot,data.length-1); // Test example for right side only
}

public int partition(int[] data, int left, int right){
    int pivot = left;
    left++;

    while (left <= right){
        while ((left <= right) && (data[left] <= data[pivot])) {
            left++;
        }

        while ((left <= right) && (data[right] >= data[pivot])){
            right--;
        }

        if (left < right){
            int temp = data[left];
            data[left] = data[right];
            data[right] = temp;
            left++;
            right--;
        }          
    }

    if (data[right] < data[pivot]){
        int temp = data[right];
        data[right] = data[pivot];
        data[pivot] = temp;
        pivot = right;
    } 

    return pivot;
}

任何帮助将不胜感激,我很难过:(

1 个答案:

答案 0 :(得分:0)

实际上您的分区实现正常,您将错误的left参数传递给partition

pivot = partition(data, pivot, data.length - 1); // Test example for right side only

应该是:

pivot = partition(data, pivot + 1, data.length - 1); // You need to exclude the pivot itself.

因为在您的实现中,您选择最左侧的元素作为数据透视表,所以当您尝试对正确的部分进行分区时,如果您将pivot作为left参数传递,那么一切都将保持不变,因为它已经是分配。