【发布时间】:2025-12-28 21:40:11
【问题描述】:
在阅读了有关它的 Wikipedia 文章后,我在 C++ 中实现了快速排序。只是想恢复我对学校的记忆,为换工作的面试做准备。
这是我的实现
#include <vector>
size_t partition(std::vector<int> & inputs, size_t leftIndex, size_t rightIndex)
{
int pivotValue = inputs[leftIndex];
size_t i = leftIndex - 1;
size_t j = rightIndex + 1;
while (true)
{
while (inputs[++i] < pivotValue);
while (inputs[--j] > pivotValue);
if (i >= j)
{
return j;
}
std::iter_swap(inputs.begin() + i, inputs.begin() + j);
}
return 0;
}
void sort(std::vector<int> & inputs, size_t leftIndex, size_t rightIndex)
{
if (leftIndex < rightIndex)
{
size_t pivot = partition(inputs, leftIndex, rightIndex);
sort(inputs, leftIndex, pivot);
sort(inputs, pivot + 1, rightIndex);
}
}
int main()
{
std::vector<int> inputs = { 3,7,1,2,9,5,4,0,8,6 };
sort(inputs, 0, inputs.size() - 1);
return 0;
}
到目前为止,我提出的所有测试输入似乎都可以正常工作。
为了清楚起见,从这里编辑
如果我们改变
if (i >= j)
{
return j;
}
到
if (i > j)
{
return j;
}
else if(i == j)
{
return j;
}
我的问题是,哪一组输入会执行下面的分区函数块?
if (i > j)
{
return j;
}
【问题讨论】:
-
最终随着您旋转的数组部分越来越小,
i >= j将触发。 -
边缘相关:认为你想要
do/while而不是在 Hoare 分区中的while (inputs[i] < pivotValue)上的普通旧while。 -
最直接的行程将是两个元素的已排序序列。但是,如果你检测你的代码,你会发现你已经用你当前的序列绊倒了它。
-
@ChristopherPisz 会出于纯粹的迂腐原因开始这样做。如果你的目标是实现 Hoare 分区并且你做了一些不同的事情,那么你就没有实现目标。 Hoare 分区递增/递减,然后进行测试,得到至少一个
i++和j--。do/while优于while的完美用例。结果会有所不同。这种变化的结果是输出或算法速度的显着差异,我不得不戳一下。我可以想象由于if (i >= j)不正确而演变成无限循环的情况。 -
@rcgldr & user4581301 嗯。我不认为*上的伪代码中如何实现算法的细节定义了特定的算法。算法是通过将问题分解为特定步骤来定义的。只要最终结果和获得结果的效率相同,您如何实施这些单独的步骤完全取决于您。查看我的代码和*上的代码,我发现结果或效率没有区别。坦率地说,我认为从 1 开始超出界限,只是重组为 do while 而不是 while,坦率地说,很愚蠢。