繁体   English   中英

Quicksort中奇怪的堆栈溢出

[英]weird stack overflow in Quicksort

我已经写了一个带有向量的Quicksort算法的实现,它在中间有一个枢轴时可以很好地工作,但是让我惊讶的是,当我随机改变枢轴选择部分时,程序给出了堆栈溢出错误! 这是在说选择的枢轴对算法没有影响的同时,这对我也很有意义,但是我不知道是什么导致了我的代码中的问题:

void quickSort(int low, int high, vector<int>& arr) {
int i = low, j = high;

//If I choose the pivot from the middle, works fine:
int pivot = arr[(low + high) / 2];

//But the next three lines won't work (instead of the line above):
//srand(time(0));
//int pivotIndex = rand() % arr.size();
//int pivot = arr.at(pivotIndex);

while (i <= j) {
    while (arr.at(i) < pivot) { ++i; }
    while (arr.at(j) > pivot) { --j; }
    if (i <= j) {
        swapElem(arr, i, j);
        ++i;
        --j;
    }
}
if (low < j)
    quickSort(low, j, arr);
if (i < high)
    quickSort(i, high, arr);
return;
}

我正在使用VS15,并且还调试了程序以查找无限递归或其他问题(尽管花了我很多年时间:) b / c有很多递归),并且成功结束了! 没有给出同样的错误! 但是,如果我一起运行整个程序,则会出现堆栈溢出错误! 所以我在这里的其他地方,我读到它与“调试”和“发布”配置文件有关,因此我将构建配置切换为发布,但它也不起作用。

请帮助,如果您需要完整的代码,我会提出。 TYIA。

为什么您要通过arr.size()而不是high - low 示例:如果选择的索引大于high ,则分区将不执行任何操作,并且您将递归地再次调用而不会减小其大小。 如果这种情况经常发生(可能会发生),特别是对于较小的大小,则堆栈将溢出。

要解决此问题,请将该行替换为:

int pivotIndex = rand() % (high - low + 1) + low;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM