寻找c++快速排序/插入排序组合中的错误

Looking for error in C++ Quicksort / Insertion sort combo

本文关键字:错误 组合 插入排序 c++ 快速排序 寻找      更新时间:2023-10-16

我试图建立一个快速排序/插入排序组合,因为有人说它相当快,因为它处理较大的子数组与快速排序和较小的数组与插入排序,但有些东西肯定是不正确的。我一直在用我生成的一些文件测试排序。我目前正在使用一个包含1,000,000个数字的文件,每个数字的范围限制为1到1,000,000。在添加插入排序之前,我能够在大约0.2秒内对100万个数字进行排序,在将插入排序作为条件if语句添加之后,我很幸运地在不到4秒内对100,000个数字进行了排序,因此我知道代码中存在错误,但我找不到它。我的代码只是这些类型的排序方法的不同在线参考的混合体,我不声称这些代码是我自己的,如果需要,可以提供原始代码的链接。但是,我使用的引用不是用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]

更改此值,您的modifiedQuicksort的性能将按照预期运行。