当枢轴不是第一个元素时计算比较

时间:2016-11-08 04:00:19

标签: java algorithm sorting quicksort

我试图实现Quicksort算法,但不同的支点似乎不起作用。 当pivot元素不是第一个元素时,它总是以递归循环结束,导致崩溃,其中变量i从数组中脱落,并且它使用完整数组再次调用自身并且没有任何变化。我认为错误是比较toSort [j]和pivot值,或者是与另一个元素交换后的第一个元素。

public static void quickSort(int[] toSort, int l, int r){
    if(r - l <= 1)return;
    counter += r - l - 1;
    int p = choosePivot(l, r);
    int pivot = toSort[p];
    int oldP = toSort[p];
    toSort[p] = toSort[l];
    toSort[l] = oldP;

    int i = l + 1;
    for(int j = l + 1; j < r; j++){
        if(toSort[j] < pivot){
            int swap = toSort[j];
            toSort[j] = toSort[i];
            toSort[i] = swap;
            i++;
        }
    }


    oldP = toSort[i - 1];
    toSort[i - 1] = toSort[l];
    toSort[l] = oldP;

    quickSort(toSort, l, i);
    quickSort(toSort, i, r);
}

public static int choosePivot(int m, int n){
    return n - 1;
    //return m;
}

1 个答案:

答案 0 :(得分:0)

问题是对quickSort()的递归调用没有收敛。最后两行的细微变化将像魔术一样发挥作用。

public static void quickSort(int[] toSort, int l, int r){
    if(r - l <= 1)return;
    counter += r - l - 1;
    int p = choosePivot(l, r);
    int pivot = toSort[p];
    int oldP = toSort[p];
    toSort[p] = toSort[l];
    toSort[l] = oldP;

    int i = l + 1;
    for(int j = l + 1; j < r; j++){
        if(toSort[j] < pivot){
            int swap = toSort[j];
            toSort[j] = toSort[i];
            toSort[i] = swap;
            i++;
        }
    }


    oldP = toSort[i - 1];
    toSort[i - 1] = toSort[l];
    toSort[l] = oldP;

    quickSort(toSort, l, i-1);
    quickSort(toSort, i, r);
}

public static int choosePivot(int m, int n){
    return n - 1;
    //return m;
}

您可以查看Ideone link以获取更新的代码。