为什么我的快速排序效率低下?

时间:2015-04-11 17:36:11

标签: c++ quicksort

我已经在线提供了各种来源的快速排序,并使用了将枢轴放在中心的技术,而不像其他人那样使用了第一个或最后一个索引。

然而,排序最终会破坏我的程序超过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);
}

谢谢

2 个答案:

答案 0 :(得分:2)

您的代码中有两个明显的错误。首先,如果在任何情况下 枢轴是最小值或最大值的时间(那个 如果值是随机的,将在某个时间发生,你离开 您正在处理的分区。如果分区是第一个 或者最后,这可能会导致未定义的行为,但在任何情况下 情况下,它不会给出正确的结果。

第二:当你再次递归时,第二次递归使用 intVect.size(),所以它调用了所有内容的函数 遗迹。这肯定是您所看到的症状的原因。

答案 1 :(得分:1)

这一行错了:

sortShit(left, intVec.size() - 1);

递归的其他一些分支负责在rightValue+1intVec.size()-1之间进行排序。您只需要使用

递归
sortShit(left, rightValue);

恢复递归调用始终在较小的集合上的不变量,因此终止。

您的通话允许右手套的大小增加,因此不保证终止。