快速排序无法对100000个整数的数据集进行一致排序 我在C++中实现了QuoSo排序算法的几种变体,但它们都有很大的缺陷。它们无法在合理的时间内对100000个整数的数据集进行排序。有时,10000个整数的数据集也会失败,但失败的频率要低得多。起初,我怀疑是我选择的枢轴导致了问题,但即使随机选择枢轴,算法也无法在合理的时间内执行。有人能帮我找出快速排序实现性能差的原因吗

快速排序无法对100000个整数的数据集进行一致排序 我在C++中实现了QuoSo排序算法的几种变体,但它们都有很大的缺陷。它们无法在合理的时间内对100000个整数的数据集进行排序。有时,10000个整数的数据集也会失败,但失败的频率要低得多。起初,我怀疑是我选择的枢轴导致了问题,但即使随机选择枢轴,算法也无法在合理的时间内执行。有人能帮我找出快速排序实现性能差的原因吗,c++,quicksort,C++,Quicksort,下面是我使用固定轴实现的快速排序 void快速排序(std::vector&list,int left,int right) { 如果(左>=右) 返回; int pivot=list[left+(right-left)/2]; int oldpoint=分区(列表、透视、左、右); 快速排序(列表,左侧,oldPivot-1); 快速排序(列表,oldPivot+1,右侧); } //霍尔分区方案 int分区(std::vector&list、int pivot、int left、int ri

下面是我使用固定轴实现的快速排序

void快速排序(std::vector&list,int left,int right)
{
如果(左>=右)
返回;
int pivot=list[left+(right-left)/2];
int oldpoint=分区(列表、透视、左、右);
快速排序(列表,左侧,oldPivot-1);
快速排序(列表,oldPivot+1,右侧);
}
//霍尔分区方案
int分区(std::vector&list、int pivot、int left、int right)
{
while(true)
{
while(列表[左]轴)
对--;
//到达枢轴时停止。
如果(左>=右)
左转;
交换(列表[左]、列表[右]);
}
}
为了测试向量100000无序整数的快速排序算法,我使用以下代码:

std::vector randomizeIntVector(int size)
{
std::随机_装置rd;
标准:mt19937 rng(rd());
标准:均匀分布和(最小值和最大值);
std::向量;
对于(int i=0;i

可以针对不同的向量大小测试代码

代码中有两个问题:第一,oldprovot是索引,而不是pivot值。代码将其用作值。将此更改为索引以消除混淆

其次,对快速排序的调用是在oldPivot的两侧进行的,而不是只向一个方向进行

另外,在分配随机向量时使用reserve,以便在内部只分配一次内存

#包括
#包括
#包括
#包括
#包括
无效快速排序(标准::向量和列表,左整数,右整数);
int分区(std::vector&list、int pivot、int left、int right);
int随机化_轴(int左,int右);
std::vector randomizeIntVector(int size);
无效打印向量(标准::向量v,左整数,右整数)
{

对于(int i=左;i)多少是“合理的”?您是否比较了排序和
std::sort
所用的时间?您所测量的时间是否符合快速排序的预期复杂性?我看不到您的代码中存在逻辑实现错误。您认为合理的时间量是多少?您的实现与标准
std::sort
相比如何?您的
 randomizeIntVector
的效率明显低下。在最坏的情况下,您有ln(n)重新分配。您应该保留足够的空间,而不是调用push back 100000次
std::sort
立即对包含100000个元素的向量进行排序。我还没有测量我的实现排序100000所需的时间,因为我在执行数分钟后终止了它。然而,对于成功的输入f 10000它的执行时间约为
real 0m0.007s
。使用
int
作为要排序的值类型和向量的索引是令人困惑的。例如,
pivot
似乎是一个值,但
oldpoivot
是一个索引。