我已经用向量编写了一个Quicksort算法的实现,它在中间工作得很好,但是当我改变枢轴选择部分随机完成时程序给出了堆栈溢出错误让我惊讶!虽然它说所选择的数据透视对算法没有影响,但对我来说也是有意义的,但我不知道在我的代码中导致此问题的是什么:< / p>
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有很多递归)并且它成功结束了!没有给出同样的错误!但是,如果我一起运行整个程序,它会给出堆栈溢出错误!在这里的其他地方,我读到它与&#34;调试&#34;有关。和&#34;发布&#34;配置文件,所以我将我的构建配置切换为发布,但它也没有工作。
请帮助,如果您需要整个代码,我会把它。 TYIA。
答案 0 :(得分:2)
为什么要按arr.size()
代替high - low
进行修改?示例:如果您选择的索引高于high
,则分区将不执行任何操作,您将在不减小大小的情况下再次递归调用。如果这种情况经常发生,它可能会发生,特别是对于较小的尺寸,那么堆栈将会溢出。
要修复用以下内容替换该行:
int pivotIndex = rand() % (high - low + 1) + low;