繁体   English   中英

quicksort实现错误java

[英]quicksort implementation bug java

我在以下我的快速排序实现中做错了什么:

public static void quicksort(int[] array, int start, int end) {
    while (start < end) {
        int pIndex = partition(array, start, end);
        quicksort(array, start, pIndex - 1);
        quicksort(array, pIndex + 1, end);
    }
}

public static int partition(int[] array, int start, int end) {
    int pivot = array[end];
    int pIndex = start;
    for (int i = start; i <= end - 1; i++) {
        if (array[i] <= pivot) {
            int tmp = array[pIndex];  // swap values
            array[pIndex] = array[i];
            array[i] = tmp;
            pIndex++;
        }
    }
    int tmpVal = array[pIndex];
    array[pIndex] = pivot;
    array[end] = tmpVal;
    return pIndex;
}

当针对数组{7,5,3,6,8,1,1,2,4}的测试用例运行它时,它会将数组重新排列为{1,2,3,4,8,5,7,6}在其中它对数组的左侧进行排序,但是随后进入{1,2}数组似乎是一个无限循环,并且永远不会离开该递归调用。 我尝试添加一个基本情况,如果array.length小于2,则返回;否则,返回0。 但这没什么区别。

这是我的代码的链接。

有人知道怎么了吗?

你的循环

for (int i = 0; i <= end - 1; i++) {

partition区内应该是

for (int i = start; i <= end - 1; i++) {

否则,您的pIndex可能会超出范围的startend ,因此您对quicksort的回溯调用将具有相同的参数。

编辑

您的ideone代码的另一个问题(上面未显示)是

if (array.length < 2) { return; }

quicksort您不会更改数组的长度,因此array.length始终为8。

第三个问题,导致无限循环的是

while (start < end) {

quicksort您不会在此循环中更改start或end的值,因此该循环永远不会退出。 有关工作示例,请参见https://ideone.com/wY23C6

while (start < end) {
    int pIndex = partition(array, start, end);
    quicksort(array, start, pIndex - 1);
    quicksort(array, pIndex + 1, end);
}

应该

if (start < end) {
    int pIndex = partition(array, start, end);
    quicksort(array, start, pIndex - 1);
    quicksort(array, pIndex + 1, end);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM