我的冒泡排序(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
相关产品推荐
相关产品推荐

