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

Java实现冒泡排序仅在数组元素≥5时报错,小数据量正常是何原因?

报错根因

你遇到的是StackOverflowError(栈溢出错误),触发原因有两个:

  1. 排序逻辑存在缺陷,递归无法正常终止
    你的内层循环j固定从下标1开始遍历,没有和外层的i挂钩,当i遍历到靠后的下标时,会把之前已经放到数组前面的更小的元素再次交换回来,导致每轮排序都一定会产生交换操作,notDone标记永远为true,递归会无限执行下去。
    当数组长度≤3时,刚好能在递归深度溢出前完成排序,所以不会报错;当数组长度≥5时,递归无法终止,最终耗尽栈空间触发报错。
  2. 递归实现本身不适合排序场景
    就算逻辑修复,当数组长度较大时,递归深度过深依然会触发栈溢出,排序类逻辑更适合用迭代实现。
修复后的代码
import java.util.Arrays;
import java.util.Scanner;

public class sorting_v2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Choose how much number you want to sort:");
        int sizeOfTab = scanner.nextInt();
        int[] numbers = new int[sizeOfTab];

        for (int i = 0; i < sizeOfTab; i++) {
            System.out.println("Choose number to collection: ");
            numbers[i] = scanner.nextInt();
        }
        scanner.close();
        System.out.println(Arrays.toString(sorting(numbers)));
    }

    private static int[] sorting(int[] numbers) {
        boolean notDone;
        for (int i = 0; i < numbers.length - 1; i++) {
            notDone = false;
            // 已经沉到末尾的有序元素不需要再比较,所以上限为length-1-i
            for (int j = 0; j < numbers.length - 1 - i; j++) {
                // 冒泡排序核心是比较相邻元素
                if (numbers[j] > numbers[j+1]) {
                    int tmp = numbers[j+1];
                    numbers[j+1] = numbers[j];
                    numbers[j] = tmp;
                    notDone = true;
                }
            }
            // 本轮无交换说明已经完全有序,直接退出
            if (!notDone) {
                break;
            }
        }
        return numbers;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:36:04