C++快速排序/插入排序组合中的错误查找

C++快速排序/插入排序组合中的错误查找,c++,sorting,quicksort,insertion-sort,C++,Sorting,Quicksort,Insertion Sort,我正在尝试构建一个快速排序/插入排序组合,有人说它相当快,因为它使用快速排序处理较大的子数组,使用插入排序处理较小的数组,但有些事情绝对不正确。我一直在用我生成的一些文件测试排序。我目前正在使用一个1000000个数字的文件,每个数字的范围限制在1到1000000之间。在添加插入排序之前,我能够在大约0.2秒内对100万个数字进行排序,在添加插入排序作为条件if语句之后,我很幸运能够在不到4秒内对100000个数字进行排序,因此我知道代码中有错误,但我找不到它。我的代码只是这些排序方法的不同在线

我正在尝试构建一个快速排序/插入排序组合,有人说它相当快,因为它使用快速排序处理较大的子数组,使用插入排序处理较小的数组,但有些事情绝对不正确。我一直在用我生成的一些文件测试排序。我目前正在使用一个1000000个数字的文件,每个数字的范围限制在1到1000000之间。在添加插入排序之前,我能够在大约0.2秒内对100万个数字进行排序,在添加插入排序作为条件if语句之后,我很幸运能够在不到4秒内对100000个数字进行排序,因此我知道代码中有错误,但我找不到它。我的代码只是这些排序方法的不同在线参考的混合体,我并不声称这些代码是我自己的,如果需要的话,可以提供原始代码的链接。但是,我使用的引用不是用C++编写的,而是面向类的,所以我不得不做一些修改,这就是为什么我认为有一个错误。
void modifiedQuickSort(arrPtr &arrayPointer, int first, int last)
{
    int firstTemp = first, lastTemp = last;
    int temp;
    int pivot = arrayPointer[(first + last) / 2];


    if((last - first) < 10)
    {
        insertionSort(arrayPointer, last + 1);
    }

    else
    {
        // Partitioning Step
        while (firstTemp <= lastTemp)
        {
            while (arrayPointer[firstTemp] < pivot)
                firstTemp++;

            while (arrayPointer[lastTemp] > pivot)
                lastTemp--;

            if (firstTemp <= lastTemp)
            {
                temp = arrayPointer[firstTemp];
                arrayPointer[firstTemp] = arrayPointer[lastTemp];
                arrayPointer[lastTemp]  = temp;
                firstTemp++;
                lastTemp--;
            }
        }

        // Recursive step
        if (first < lastTemp)
            modifiedQuickSort(arrayPointer, first, lastTemp);

        if (firstTemp < last)
            modifiedQuickSort(arrayPointer, firstTemp, last);
    }
}

void insertionSort(arrPtr &arrayPointer, const int &arraySize)
{
    int i, key, j;

    for (i = 1; i < arraySize; i++)
    {
        key = arrayPointer[i];

        j = i-1;

        /* Move elements of arr[0..i-1], that are
         greater than key, to one position ahead
         of their current position */
        while (j >= 0 && arrayPointer[j] > key)
        {
            arrayPointer[j+1] = arrayPointer[j];
            j = j-1;
        }
        arrayPointer[j+1] = key;
    }
}

如果检查插入排序的执行情况,您会发现它可以对比大小10大得多的数组进行排序。如果你遵循πάντα链接中给出的极好建议,这一点就会被发现ῥεῖ.

如果您仍然有一个bug,那么首先仔细检查您的规范是否包含每个方法的所有先决条件和后决条件

如果您仍然有一个bug,那么学习如何编写断言来验证您的前置条件和后置条件

函数调用

if((last - first) < 10)
{
    insertionSort(arrayPointer, last + 1);
}
指示insertionSort对整个阵列[0,last]而不是[first,last]进行操作


更改此选项,修改后的快速排序的性能将按预期运行。

解决此类问题的正确工具是调试器。在询问堆栈溢出之前,应该逐行检查代码。如需更多帮助,请阅读。至少,您应该[编辑]您的问题,以包括一个重现您的问题的示例,以及您在调试器中所做的观察。我非常熟悉调试器,我一直在使用它。问题是,算法是有效的。到目前为止,排序没有问题。然而,调试器无法告诉我为什么该算法没有它所期望的那么有效,或者甚至远没有快速排序那么有效。我将尝试编辑此文件以帮助其他人运行它。通过对已排序的段使用二进制搜索来查找插入点,您的插入排序可能会更加有效。这种线性搜索最终会累加起来。这就解决了它。谢谢