Quicksort正确的实现,但进行了一些额外的比较

时间:2016-07-25 16:56:28

标签: c++ recursion quicksort

我正试图从我的Quicksort实现中获取最大值。它在功能上是正确的并具有规范形式,但我已经计算了一些多余的比较。我使用第一个元素作为支点:

#include <vector>

using namespace std;
using uint = unsigned int;

uint PartitionSub(vector<uint>& inp, uint l, uint r, uint& numOfCmp);

void QuickSort(vector<uint>& inp, uint l, uint r, uint& numOfCmp)
{
    if (r - l < 2)
        return;

    uint newPivotIdx = PartitionSub(inp, l, r, numOfCmp);

    QuickSort(inp, l, newPivotIdx, numOfCmp);
    QuickSort(inp, newPivotIdx + 1, r, numOfCmp);
}

uint PartitionSub(vector<uint>& inp, uint l, uint r, uint& numOfCmp)
{
    auto swap = [&inp](uint a, uint b)
    {
        uint buf = inp[a];
        inp[a] = inp[b];
        inp[b] = buf;
    };

    //numOfCmp += r - l; // we can use this, but ++numOfCmp just before     
                         // comparison is more clear
    uint i = l + 1;
    uint j = l + 1;

    uint p = inp[l];

    for (; j <= r; j++)
    {
        ++numOfCmp;
        if (inp[j] < p)
        {
            if (i != j)
                swap(i, j);
            i++;
        }
    }

    uint newPivotIdx = i - 1;
    swap(l, newPivotIdx);
    return newPivotIdx;
}

鉴于输入:3,9,8,4,6,10,2,5,7,1只需要进行25次比较,但确实有27次。我已经调试了这三天并且没有任何线索。如果你们看到任何地方都应该在减少比较的意义上进行优化,你能否给我一些指示?据我了解,这是由于冗余递归传递,因为分区子程序及其中的计数是正确实现的。

1 个答案:

答案 0 :(得分:1)

我可能已经发现了这个问题:

QuickSort(inp, l, newPivotIdx, numOfCmp);
QuickSort(inp, newPivotIdx + 1, r, numOfCmp);

您不需要在递归中包含pivot元素;我们知道它处于正确的位置。改变第一行

QuickSort(inp, l, newPivotIdx-1, numOfCmp);

您没有显示任何调试输出,例如函数输入上的打印参数的痕迹,我担心我现在没有时间自己做。我希望这恰好是问题所在。