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

我的冒泡排序(Bubble Sort)程序出现数组越界异常,请求协助解决

冒泡排序数组越界异常的分析与修复

嘿,这个问题我太熟了!咱们直接揪出导致ArrayIndexOutOfBoundsException的元凶:

问题根源

你的内层循环条件写的是 j <= a.length - 1,当j遍历到数组最后一个索引(也就是a.length-1)的时候,你尝试访问a[j+1]——这时候j+1等于a.length,而Java数组的索引范围是从0到a.length-1,超出这个范围自然就抛出数组越界异常了。

而且还有个小细节可以优化:冒泡排序每完成一轮外层循环,都会把当前最大的元素“沉”到数组的末尾,所以后面的元素其实已经是有序的了,没必要每次都遍历整个数组。

修复后的完整代码

class Bubble {
    public static void main(String args[]) {
        int[] a = {20, 22, 19, 45, 9};
        int temp;
        // 外层循环:控制排序的轮数,只需要循环length-1次即可完成排序
        for (int i = 0; i < a.length - 1; i++) {
            // 内层循环:每轮只需要比较到未排序的最后一个元素
            // 减去i是因为每轮结束后,最后i个元素已经有序,无需再比较
            for (int j = 0; j < a.length - 1 - i; j++) {
                if (a[j] > a[j + 1]) {
                    temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                }
            }
        }
        // 输出排序后的数组
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + " ");
        }
    }
}

进阶优化:提前终止有序数组的排序

如果数组在某一轮循环中没有发生任何交换,说明数组已经完全有序了,这时候可以直接跳出循环,不用再继续后续的轮次,能提升不少效率:

class Bubble {
    public static void main(String args[]) {
        int[] a = {20, 22, 19, 45, 9};
        int temp;
        boolean swapped;
        for (int i = 0; i < a.length - 1; i++) {
            swapped = false;
            for (int j = 0; j < a.length - 1 - i; j++) {
                if (a[j] > a[j + 1]) {
                    temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                    swapped = true;
                }
            }
            // 如果这一轮没有交换,说明数组已经有序,直接退出循环
            if (!swapped) {
                break;
            }
        }
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + " ");
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 16:17:43