冒泡排序Java代码抛出ArrayIndexOutOfBoundsException异常求修复(升序)
数组排序越界异常解决方案
异常原因
数组索引从0开始,你的数组长度为6,最大有效索引是5。原代码内层循环条件j < nums.length会让j取到5,此时访问nums[j+1]即nums[6],超出数组范围,触发ArrayIndexOutOfBoundsException。
基础修复代码
将内层循环的终止条件改为j < nums.length - 1,避免访问超出数组边界的索引:
public class Main { public static void main(String[] args){ int nums[] = {9,8,4,5,6,7}; int temp=0; for(int i=0;i<nums.length;i++){ // 修改内层循环终止条件,防止j+1越界 for(int j=0;j<nums.length - 1;j++){ if(nums[j]>nums[j+1]){ //swap temp=nums[j]; nums[j]=nums[j+1]; nums[j+1]=temp; } } } for(int i=0;i<nums.length;i++){ //print array after sorting System.out.print(nums[i]+"-->"); } } }
优化版冒泡排序
原代码是基础冒泡排序,存在不必要的重复比较。可以做两处优化,提升排序效率:
public class Main { public static void main(String[] args){ int nums[] = {9,8,4,5,6,7}; int temp=0; boolean swapped; // 标记本轮是否发生交换 for(int i=0;i<nums.length;i++){ swapped = false; // 每轮只比较到未排序的最后一个元素,减少重复比较 for(int j=0;j<nums.length - 1 - i;j++){ if(nums[j]>nums[j+1]){ temp=nums[j]; nums[j]=nums[j+1]; nums[j+1]=temp; swapped = true; } } // 本轮无交换说明数组已完全有序,提前终止循环 if(!swapped){ break; } } // 用增强for循环简化打印逻辑 for(int num : nums){ System.out.print(num+"-->"); } } }
优化说明
- 内层循环改为
j < nums.length - 1 - i:每一轮外层循环后,末尾的i个元素已经是有序的最大值,无需再参与比较 - 增加
swapped标记:当某一轮没有元素交换时,说明数组已经完全有序,直接退出循环,避免后续无效循环 - 使用增强for循环简化数组遍历打印代码
内容的提问来源于stack exchange,提问作者Vineeta Barkha
相关产品推荐
相关产品推荐

