尝试对大型排序的容器进行排序时,Quicksort会生成退出代码-1073741571(0xC00000FD)

时间:2019-04-14 08:57:13

标签: c++ quicksort

我正在尝试实施一个有效的快速排序,即Lomuto变体。我正在使用维基百科的伪代码。 https://en.wikipedia.org/wiki/Quicksort

void quickSortLomuto(int *first, int *last) {
    if(first < last){
        int *pivot= partitionLomuto(first,last);
        quickSortLomuto(first, pivot- 1);
        quickSortLomuto(pivot+ 1,last);
    }
}
int* partitionLomuto(int* first, int* last) {
    int pivot = *last;
    int *i = first;
    for(int* j = first;j <= last -1;j++){

        if(*j < pivot){
            std::swap(*i,*j);
            i++;
        }
    }
    std::swap(*i,*last);
    return i;
}

对于带有随机数的大型容器,它可以正常工作。它会分解并为已排序的容器生成退出代码-1073741571(0xC00000FD)。对于非常小的分类容器,它可以工作,但是如果容器的大小大于1 00 000,则会崩溃,并显示上面的错误代码

1 个答案:

答案 0 :(得分:1)

原因有两个:首先,使用可能的最差的枢轴值。对于已经排序的数组,它需要O(n ^ 2)执行时间。常用的策略是使用随机项目作为枢轴值,中间项目或第一,最后和中间项目的中间值。

另一个原因是由于执行递归的方式,堆栈溢出。为避免这种情况:找到较小的范围并对其进行递归排序。然后,通过更改“ first”和“ last”参数,在不使用递归的情况下,而是在同一函数内对较大范围进行排序。这样,堆栈的深度最多为log n。

如果您的目标是从Wikipedia复制该算法,则您的代码很好,并且可能会导致崩溃。如果您的目标是对数据进行排序,那么您复制的伪代码就不是很好。