You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Exception in thread "main" java.lang.StackOverflowError 快排代码问题求助

StackOverflowError 报错原因

StackOverflowError 是递归调用层级超出JVM栈内存上限导致的错误,你的快速排序代码存在核心逻辑错误,导致递归无法正常收敛,最终无限触发递归调用引发该报错:

  • 核心错误1:partition函数中错误将arr[0]作为固定枢轴,而非当前处理分区的首元素arr[low]
    快速排序每次处理的是[low, high]区间的子数组,你固定选择整个数组的第一个元素作为枢轴,当递归处理非起始位置的子分区时,枢轴完全不属于当前处理的区间,会导致分区逻辑完全错乱,无法正常缩小问题规模,最终陷入无限递归。
  • 核心错误2:内层指针移动逻辑没有增加边界判断
    没有low < high的边界约束的情况下,指针可能会移动出当前分区甚至数组边界,既会触发数组越界异常,也会导致分区返回的位置错误,打乱后续递归的区间范围。
  • 次要逻辑问题:分区结束后pivot = temp的赋值无实际作用,属于冗余代码,原代码中残留的enter code here字符也会导致编译异常。
修复后可正常运行的代码
class Solution
{
    static void quickSort(int arr[], int low, int high)
    {   
        if(low < high){
            int pivot = partition(arr, low, high);
            quickSort(arr, low, pivot - 1);
            quickSort(arr, pivot + 1, high);
        }
    }
    static int partition(int arr[], int low, int high)
    {
        // 选择当前分区的首元素作为枢轴
        int pivot = arr[low];
        while(low < high){
            // 右指针向左找小于等于枢轴的元素,增加边界判断防止越界
            while(low < high && arr[high] > pivot){
                high--;
            }
            if(low < high) {
                arr[low] = arr[high];
                low++;
            }
            // 左指针向右找大于枢轴的元素,增加边界判断防止越界
            while(low < high && arr[low] <= pivot){
                low++;
            }
            if(low < high) {
                arr[high] = arr[low];
                high--;
            }
        }
        // 将枢轴放到左右指针相遇的最终位置
        arr[low] = pivot;
        return low;
    } 
}
额外优化建议

如果需要处理已经有序的大规模数组,建议选择随机位置元素、或者区间首尾中间三个元素的中位数作为枢轴,避免快排退化为O(n²)时间复杂度,递归深度过高触发栈溢出。

内容的提问来源于stack exchange,提问作者Pratulya Pratap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 19:45:03