快速排序-最坏的情况会导致堆栈溢出
Quicksort - Worst case results in stack overflow?
我正在尝试实现快速排序算法,其中我选择pivot作为最右边的元素。。但是,当约4000个元素的数组已经排序时,就会发生堆栈溢出。这是我的实现:
void quickSortSimpleAscending(int elements[], int startindex, int endindex)
{
int pivot = elements[endindex];
int i = startindex;
int j = endindex;
while (i < j)
{
while (elements[i] < pivot)
i++;
while (elements[j] > pivot)
j--;
if (i <= j)
{
swap(elements[i], elements[j]);
i++;
j--;
}
}
if (startindex < j)
quickSortSimpleAscending(elements, startindex, j);
if (i < endindex)
quickSortSimpleAscending(elements, i, endindex);
}
如果不使用"三的中位数"方法,有没有办法解决这个问题?谢谢
首先,很高兴看到您的代码没有使用三的中值来选择枢轴。您只需选择元素向右旋转即可。
如果不使用"三的中位数"方法,有没有办法解决这个问题?
三的中位数本身并不是堆栈溢出的原因。当通过连续和递归调用获得坏分区时,可能会发生溢出;也就是说,当枢轴导致左分区比右分区大得多时。在您的具体案例中,如果数组已经排序,那么您将获得n - 1
元素的左分区和零大小的右分区。下一次你会得到一个n - 2
的左分区,依此类推。所以算法会执行n
递归调用,对于适度的堆栈大小,它会溢出。
解决方案
为了降低溢出的风险,并在实践中避免溢出,解决方案是首先对最小的分区进行排序。使用这种方法,当您获得最佳分区时,最坏的情况将发生;也就是说,当它们的大小趋于相等时。在这种情况下,连续递归调用的最大数量为log(n)
。
我希望这将对有帮助
事实上,如果不限制递归的深度,迟早会出现堆栈溢出。一种常见的解决方法是在函数中添加第四个参数以跟踪深度,并在达到一定限制时切换到其他排序算法。
相关文章:
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- C++ 对象数组堆栈溢出
- 有没有一种方法可以捕获进程中的堆栈溢出?C++Linux
- 对象接收堆栈溢出异常 c++ 的排序向量
- 将公共递归转换为尾递归,因为大型输入的堆栈溢出
- C++ 中递归期间的堆栈溢出
- 启动 dll 时 C# 环境堆栈溢出
- 在C++中使用数组时如何防止堆栈溢出?
- 如何修复递归函数导致的堆栈溢出错误?C++
- 当我尝试为结构分配新指针时出现堆栈溢出错误
- 为什么析构函数无休止地调用自己(导致堆栈溢出)?
- 为什么堆栈溢出?如有建议,不胜感激
- 主函数执行时C++堆栈溢出异常
- 如何在不导致堆栈溢出的情况下计算非常大的数字和很小的 HCF.我正在使用欧几里得算法
- 我正在尝试使用回溯来解决 N queen 问题,但在编译时它会给出运行时错误(动态堆栈缓冲区溢出)
- 如何在Windows上报告堆栈缓冲区溢出
- 如何抑制来自 gcc 中地址清理器的堆栈缓冲区溢出
- 声明大数组时堆栈/堆溢出
- c++中栈溢出和分段错误的危险