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

使用快速排序算法排序7个数字时出现StackOverflowError问题排查

快速排序递归引发StackOverflowError的原因与修复

错误原因分析

你的代码出现StackOverflowError的核心问题是分区逻辑错误导致无限递归:

  • 在遍历数组分配元素到left_arr和right_arr时,你没有排除选中的pivot元素,而是将pivot也加入了left_arr(因为element <= pivot的条件包含了pivot本身)。
  • 当随机选中的pivot是当前数组的最大值时,所有元素(包括pivot)都会被放入left_arr,此时left_arr的大小和原数组完全一致。递归调用quick_sort(left_arr)时,永远无法触发arr.size() <= 1的终止条件,递归会无限进行,最终耗尽栈空间引发溢出。

以你的输入{6,15,32,643,6543,534232,232}为例,当随机选中最大值534232作为pivot时,left_arr会包含全部7个元素,递归陷入死循环。

修复方案

修改分区逻辑,遍历数组时跳过pivot元素,确保left_arr和right_arr的大小严格小于原数组:

import java.util.Scanner;
import java.util.ArrayList;
public class quick_sort_demo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        ArrayList<Integer> my_arr = new ArrayList<Integer>();
        while (true) {
            System.out.println("Enter input value. '-1' to exit the adding process. ");
            int val = sc.nextInt();
            sc.nextLine();
            if (val == -1) {
                break;
            } else {
                my_arr.add(val);
            }
        }
        // 添加输出语句查看排序结果
        System.out.println("排序后数组:" + quick_sort(my_arr));
    }
    public static ArrayList<Integer> quick_sort(ArrayList<Integer> arr) {
        if (arr.size() <= 1) {
            return arr;
        }
        int pivot_index = (int) (Math.random() * arr.size());
        int pivot = arr.get(pivot_index);
        ArrayList<Integer> left_arr = new ArrayList<Integer>();
        ArrayList<Integer> right_arr = new ArrayList<Integer>();
        
        for (int i = 0; i < arr.size(); i++) {
            // 跳过pivot元素,不加入左右数组
            if (i == pivot_index) {
                continue;
            }
            int element = arr.get(i);
            if (element > pivot) {
                right_arr.add(element);
            } else {
                left_arr.add(element);
            }
        }
        left_arr = quick_sort(left_arr);
        right_arr = quick_sort(right_arr);
        ArrayList<Integer> result = new ArrayList<Integer>();
        result.addAll(left_arr);
        result.add(pivot);
        result.addAll(right_arr);
        return result;
    }
}

额外说明

  • 修复后的代码中,我们在遍历数组时通过i == pivot_index跳过了pivot元素,保证每次递归处理的子数组规模都会缩小,最终触发终止条件。
  • 同时在main方法中添加了输出语句,方便查看排序后的结果。

内容的提问来源于stack exchange,提问作者ege.exe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:32:05