快速排序导致堆栈溢出
Quicksort causing stackoverflow?
这是我对快速排序的实现:
int choosePivotIndex(int l, int r)
{
return l + rand() % (r + 1 - l);
}
void swap(int a[], int l, int r)
{
int tmp = a[l];
a[l] = a[r];
a[r] = tmp;
}
int partition(int a[], int l, int r)
{
int p = choosePivotIndex(l, r);
swap(a, p, r);
int d = l;
for (int i = l ; i < r ; ++i)
{
if (a[i] < a[r])
{
swap(a, i, d);
++d;
}
}
swap(a, d, r);
return d;
}
void quickSort(int a[], int l, int r)
{
if (l < r)
{
int p = partition(a, l, r);
quickSort(a, l, p - 1);
quickSort(a, p + 1, r);
}
}
void quickSort(int a[], int len)
{
srand(static_cast<unsigned int>(time(nullptr)));
quickSort(a, 0, len - 1);
}
我是这样使用它的:
int a[10];
quickSort(a, 10);
它似乎适用于小数组,但是当我为它提供一个大数组时(例如 300 000
元素)我收到堆栈溢出错误。我试图通过在较小的部分使用递归并在while
循环中对较大的部分进行排序来补救它:
void quickSort(int a[], int l, int r)
{
while (l < r)
{
int p = partition(a, l, r);
if (p - l < r - p)
{
quickSort(a, l, p - 1);
l = p + 1;
}
else
{
quickSort(a, p + 1, r);
r = p - 1;
}
}
}
但我得到了相同的结果。我做错了什么吗?如何使其适用于更大的阵列?
根据注释部分中的讨论,代码似乎很好,有问题的部分将是堆栈上数组的声明
int a[10];
这对于较小的数组来说很好,很容易遇到带有大型数组的堆栈溢出,要测试这一点,您可以声明一个大型int a[1000000]
数组,如果没有快速排序代码,您仍然会得到堆栈溢出。因此,建议通过执行new
在堆上声明它们
相关文章:
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- C++ 对象数组堆栈溢出
- 有没有一种方法可以捕获进程中的堆栈溢出?C++Linux
- 对象接收堆栈溢出异常 c++ 的排序向量
- 将公共递归转换为尾递归,因为大型输入的堆栈溢出
- C++ 中递归期间的堆栈溢出
- 启动 dll 时 C# 环境堆栈溢出
- 在C++中使用数组时如何防止堆栈溢出?
- 如何修复递归函数导致的堆栈溢出错误?C++
- 当我尝试为结构分配新指针时出现堆栈溢出错误
- 为什么析构函数无休止地调用自己(导致堆栈溢出)?
- 为什么堆栈溢出?如有建议,不胜感激
- 主函数执行时C++堆栈溢出异常
- 如何在不导致堆栈溢出的情况下计算非常大的数字和很小的 HCF.我正在使用欧几里得算法
- 递归克隆图时的堆栈溢出
- 防止 CRTP 特征码在"pure virtual"调用中堆栈溢出
- 静态数组溢出堆栈(seg 错误 11)仅在类定义内部时,否则不会..?
- 使用递归的溢出堆栈
- c++中栈溢出和分段错误的危险