如何避免快速排序堆栈溢出
How can I avoid Quick Sort stack overflow
当我在C++中使用快速排序时,Visual studio 2013会警告堆栈溢出错误。
如何解决此问题?在这个问题上,我不能使用这种快速排序吗?
我想是因为我在快速排序中使用了递归,所以这个问题使得很多深度内存堆栈。
这是代码。
int partition(int **array, int p, int r){
int x = array[r][1];
int i = p - 1;
int j;
int temp0, temp1;
for (j = p; j < r; j++){
if (array[j][1] <= x){
i++;
temp0 = array[i][0];
temp1 = array[i][1];
array[i][0] = array[j][0];
array[i][1] = array[j][1];
array[j][0] = temp0;
array[j][1] = temp1;
}
}
temp0 = array[i + 1][0];
temp1 = array[i + 1][1];
array[i + 1][0] = array[r][0];
array[i + 1][1] = array[r][1];
array[r][0] = temp0;
array[r][1] = temp1;
return i + 1;
}
void quickSort(int **array, int p, int r){
int q;
if (p < r){
q = Partition(array, p, r);
quickSort(array, p, q - 1);
quickSort(array, q + 1, r);
}
}
在代码中,您总是先执行前半部分(array,p,q-1)。这可能导致堆栈溢出。相反,总是先执行两个子数组中最小的一个子数组,然后强制尾部递归。
void quickSort(int **array, int p, int r){
while (r - p >= 1){
int q = Partition(array, p, r);
if ((q - 1) - p <= r - (q + 1)){
quicksort(array, p, q - 1);
// Prepare for tail recursion
p = q + 1;
}
else {
quicksort(array, q + 1, r);
// Prepare for tail recursion
r = q - 1;
}
}
}
这样做,可以证明堆栈上递归调用的最大数量是log_{2}(n)。
相关文章:
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- C++ 对象数组堆栈溢出
- 有没有一种方法可以捕获进程中的堆栈溢出?C++Linux
- 对象接收堆栈溢出异常 c++ 的排序向量
- 将公共递归转换为尾递归,因为大型输入的堆栈溢出
- C++ 中递归期间的堆栈溢出
- 启动 dll 时 C# 环境堆栈溢出
- 在C++中使用数组时如何防止堆栈溢出?
- 如何修复递归函数导致的堆栈溢出错误?C++
- 当我尝试为结构分配新指针时出现堆栈溢出错误
- 为什么析构函数无休止地调用自己(导致堆栈溢出)?
- 为什么堆栈溢出?如有建议,不胜感激
- 主函数执行时C++堆栈溢出异常
- 如何在不导致堆栈溢出的情况下计算非常大的数字和很小的 HCF.我正在使用欧几里得算法
- 递归克隆图时的堆栈溢出
- 防止 CRTP 特征码在"pure virtual"调用中堆栈溢出
- 静态数组溢出堆栈(seg 错误 11)仅在类定义内部时,否则不会..?
- 使用递归的溢出堆栈
- c++中栈溢出和分段错误的危险