Java快速排序实现(代码修复)

时间:2014-11-29 17:57:20

标签: java quicksort

我已经用Java编写了我的Quick Sort版本但是在调用第二次递归时我遇到了一些问题。这是我的代码:

public static int[] quickSort(int[] array, int start, int end) {
    int pIndex;
    if (start < end) {
        int left = start;
        int right = end - 1;
        int pivot = array[end];

        //Start the partitioning

        while (left < right) {
            if (array[left] > pivot && array[right] < pivot) {
                int temp = array[left];
                array[left] = array[right];
                array[right] = temp;
                left++;
                right--;
            } else if (array[left] > pivot)
                right--;
            else
                left++;
        }

        if (array[end] < array[left]) {
            int temp = array[left];
            array[left] = array[end];
            array[end] = temp;
            pIndex = left;
        } else
        pIndex = end;
        //End partitioning            

        quickSort(array, 0, pIndex - 1);
        quickSort(array, pIndex + 1, array.length - 1);
    }
    return array;
}

参数start将是数组中第一个元素的索引,end将是最后一个元素的索引,我选择最后一个元素作为数据透视。

我遇到的问题是 quickSort(array,pIndex + 1,array.length - 1);

array.length-1导致它无限地继续,因为它引用了原始数组。我有没有办法解决这个问题而不必每次都将新数组传递给函数?

我确实尝试创建一个全局变量来存储新的长度,但我无法做到这一点。

提前致谢。

如果代码不是Sort的非常好的实现,我很抱歉。我想自己一个人写一个,但结果我遇到了问题。

1 个答案:

答案 0 :(得分:1)

在QuickSort中使用递归的正确方法是使用startpivotend

您似乎正在使用包容性结束索引;然后你会想要进入

quicksort(data, start, pivot - 1)
quicksort(data, pivot + 1, end)

枢轴元素已经处于最终位置。