为什么我的快速排序效率如此低下
Why is my quicksort so inefficient?
我从各种在线来源进行了快速排序,并使用将枢轴放在中心而不是像其他人那样使用第一个或最后一个索引的技术进行了我的排序。
但是,这种排序最终会破坏我的程序超过 80 个元素,因为它只是冻结,我认为这是因为它的内存效率低下。
它尝试排序的数据绝不是已经排序和完全随机的。
void swapVecPos(int posOne, int posTwo)
{
int temp = intVec[posOne];
intVec[posOne] = intVec[posTwo];
intVec[posTwo] = temp;
}
void sortShit(int leftValue, int rightValue)
{
int left = leftValue;
int right = rightValue;
int pivot = intVec[(leftValue + rightValue) / 2];
while(left <= right)
{
while(intVec[left] < pivot)
{
left++;
}
while(intVec[right] > pivot)
{
right--;
}
if(left <= right)
{
swapVecPos(left, right);
left++;
right--;
}
}
if(leftValue < right)
sortShit(leftValue, right);
if(left < rightValue)
sortShit(left, intVec.size() - 1);
}
谢谢
代码中有两个明显的错误。 首先,如果有的话时间枢轴是最小值或最大值(并且如果值是随机的,则会在某个时间发生),您离开您正在处理的分区。 如果分区是第一个或者最后,这可能会导致未定义的行为,但在任何在这种情况下,它不会给出正确的结果。
第二:当你递归时,第二个递归使用 intVect.size()
,所以它对所有仍然。 这肯定是你看到的症状的原因。
这一行是错误的:
sortShit(left, intVec.size() - 1);
递归的其他一些分支负责在rightValue+1
和intVec.size()-1
之间进行排序。 您只需要使用
sortShit(left, rightValue);
它恢复了递归调用始终在连续较小的集合上并因此终止的不变性。
您的呼叫允许右侧集的大小增长,因此不能保证终止。
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 我的字符计数代码计算错误.为什么
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- cmake在我的项目中所需的所有静态库都不成功
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 为什么我的for循环不能正确获取argv
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 0-1背包代码中的错误.我的代码中有什么错误
- 当我的阵列太大时出现分段错误
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 为什么二进制搜索在我的测试中不起作用
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- OpenGL在启用深度测试时不会丢弃我的碎片
- 为什么我的 std::ref 无法按预期工作?
- 为什么我的快速排序效率如此低下
- OpenMP for循环并行化:我的代码效率很低