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

Posted

技术标签:

【中文标题】当枢轴不是第一个元素时计算比较【英文标题】:Counting Comparisons When The Pivot Is Not The First Element 【发布时间】:2016-11-08 04:00:19 【问题描述】:

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

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】:

问题是对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 以获取更新的代码。

【讨论】:

非常感谢!这是一个巨大的帮助! @hello-world 我以为你最近自己想通了。!上述解决方案有效吗?

以上是关于当枢轴不是第一个元素时计算比较的主要内容,如果未能解决你的问题,请参考以下文章

使用第一个元素作为枢轴进行快速排序[关闭]

第一个和最后一个枢轴元素与具有非常大 N 的通用放置

如何用spss做卡方检验时计算OR值

快速排序:选择枢轴

当经纬度为已知点时计算100米距离

for 循环的“计数限制”表达式是不是只计算一次,还是在每次迭代时计算?