C++ 为什么我的快速排序如此低效?

C++ 为什么我的快速排序如此低效?,c++,quicksort,C++,Quicksort,我从网上的各种来源做了一个快速排序,我的排序使用的技术是将轴心点放在中间,而不是像其他人那样的第一个或最后一个索引 然而,排序最终破坏了我的程序超过80个元素,因为它只是冻结,我认为这是因为它的内存效率低下 它试图排序的数据决不是已经排序过的,而是完全随机的 void swapVecPos(int posOne, int posTwo) { int temp = intVec[posOne]; intVec[posOne] = intVec[posTwo]; intVec

我从网上的各种来源做了一个快速排序,我的排序使用的技术是将轴心点放在中间,而不是像其他人那样的第一个或最后一个索引

然而,排序最终破坏了我的程序超过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);
}
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
,他会遇到这个问题。从一个小集合开始,在调试器中逐步完成代码,