[英]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.