C++ 为什么我的快速排序如此低效?
我从网上的各种来源做了一个快速排序,我的排序使用的技术是将轴心点放在中间,而不是像其他人那样的第一个或最后一个索引 然而,排序最终破坏了我的程序超过80个元素,因为它只是冻结,我认为这是因为它的内存效率低下 它试图排序的数据决不是已经排序过的,而是完全随机的C++ 为什么我的快速排序如此低效?,c++,quicksort,C++,Quicksort,我从网上的各种来源做了一个快速排序,我的排序使用的技术是将轴心点放在中间,而不是像其他人那样的第一个或最后一个索引 然而,排序最终破坏了我的程序超过80个元素,因为它只是冻结,我认为这是因为它的内存效率低下 它试图排序的数据决不是已经排序过的,而是完全随机的 void swapVecPos(int posOne, int posTwo) { int temp = intVec[posOne]; intVec[posOne] = intVec[posTwo]; intVec
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);
}
void swapVecPos(int posOne,int posTwo)
{
inttemp=intVec[posOne];
intVec[posOne]=intVec[posTwo];
intVec[posTwo]=温度;
}
void sortShit(int leftValue,int rightValue)
{
int left=leftValue;
int right=rightValue;
int pivot=intVec[(leftValue+rightValue)/2];
while(左枢轴)
{
对--;
}
如果(左此行错误:
递归的另一个分支负责在rightValue+1
和intVec.size()-1
之间进行排序
sortShit(left, rightValue);
它恢复了递归调用始终在连续较小的集合上的不变量,因此终止
您的呼叫允许右侧通话集的大小增加,因此不能保证终止。这一行是错误的:
递归的另一个分支负责在rightValue+1
和intVec.size()-1
之间进行排序
sortShit(left, rightValue);
它恢复了递归调用始终在连续较小的集合上的不变量,因此终止
您的呼叫允许右侧通话集的大小增加,因此不能保证终止。这一行是错误的:
递归的另一个分支负责在rightValue+1
和intVec.size()-1
之间进行排序
sortShit(left, rightValue);
它恢复了递归调用始终在连续较小的集合上的不变量,因此终止
您的呼叫允许右侧通话集的大小增加,因此不能保证终止。这一行是错误的:
递归的另一个分支负责在rightValue+1
和intVec.size()-1
之间进行排序
sortShit(left, rightValue);
它恢复了递归调用始终在连续较小的集合上的不变量,因此终止
您的调用允许右侧集合的大小增加,因此不能保证终止。代码中有两个明显的错误。首先,如果有错误
时间轴是最小值或最大值(以及
将在某个时间发生(如果值是随机的),您离开
正在处理的分区。如果该分区是第一个
最后,这可能会导致未定义的行为,但是
在这种情况下,它不会给出正确的结果
第二:当您进行递归时,第二个递归使用
intVect.size()
仍然存在。这肯定是您看到的症状的原因。您的代码中有两个明显的错误。首先,如果有任何错误
时间轴是最小值或最大值(以及
将在某个时间发生(如果值是随机的),您离开
正在处理的分区。如果该分区是第一个
最后,这可能会导致未定义的行为,但是
在这种情况下,它不会给出正确的结果
第二:当您进行递归时,第二个递归使用
intVect.size()
仍然存在。这肯定是您看到的症状的原因。您的代码中有两个明显的错误。首先,如果有任何错误
时间轴是最小值或最大值(以及
将在某个时间发生(如果值是随机的),您离开
正在处理的分区。如果该分区是第一个
最后,这可能会导致未定义的行为,但是
在这种情况下,它不会给出正确的结果
第二:当您进行递归时,第二个递归使用
intVect.size()
仍然存在。这肯定是您看到的症状的原因。您的代码中有两个明显的错误。首先,如果有任何错误
时间轴是最小值或最大值(以及
将在某个时间发生(如果值是随机的),您离开
正在处理的分区。如果该分区是第一个
最后,这可能会导致未定义的行为,但是
在这种情况下,它不会给出正确的结果
第二:当您进行递归时,第二个递归使用
intVect.size()
仍然存在。这肯定是您看到的症状的原因。从一个小集合开始,逐行在调试器中逐步检查代码,以确保代码符合您的预期。谈到预期,对于某些指定输入,预期和实际输出是什么?以及如何使用函数?请提供。你可以通过更改left@BenVoigt来改进它。我认为那里无论如何都有一个bug。如果right==left
,那么他最终会得到right
,这不是他想要的。因此,如果left==right-1
,他就会有这个问题。从一个小集合开始,然后在一个deb中逐步遍历代码ugger,逐行,以确保代码符合您的预期。谈到预期,对于某些指定的输入,预期的和实际的输出是什么?以及如何使用这些函数?请提供一个。您可以通过更改left@BenVoigt来改进它。我认为仍然存在错误。如果right==left
,则n他最终会得到right
,这不是他想要的。因此,如果left==right-1
,他会遇到这个问题。从一个小集合开始,在调试器中逐步完成代码,