我正试图从我的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次。我已经调试了这三天并且没有任何线索。如果你们看到任何地方都应该在减少比较的意义上进行优化,你能否给我一些指示?据我了解,这是由于冗余递归传递,因为分区子程序及其中的计数是正确实现的。
答案 0 :(得分:1)
我可能已经发现了这个问题:
QuickSort(inp, l, newPivotIdx, numOfCmp);
QuickSort(inp, newPivotIdx + 1, r, numOfCmp);
您不需要在递归中包含pivot元素;我们知道它处于正确的位置。改变第一行
QuickSort(inp, l, newPivotIdx-1, numOfCmp);
您没有显示任何调试输出,例如函数输入上的打印参数的痕迹,我担心我现在没有时间自己做。我希望这恰好是问题所在。