Java选择排序程序在Eclipse运行报ArrayIndexOutOfBoundsException异常求助
异常产生原因
- 直接触发数组越界的代码是
a[minind]=a[temp];:temp变量存储的是数组元素的值,不是数组下标,你错误地将temp作为下标访问数组。你的测试输入中第一个元素为4,数组长度为4,合法下标范围是0~3,访问下标为4的数组位置自然会触发越界报错。 - 除了越界问题外,你的选择排序逻辑还存在两处错误,即使修复越界问题也无法得到正确排序结果:
- 内层循环遍历范围错误:选择排序内层循环需要从
i+1的位置开始查找当前轮次的最小值,不需要从0开始遍历,也不需要做len-1-i的截断,直接遍历到数组末尾即可 - 交换逻辑位置错误:应该在内层循环完整遍历、确定当前轮次的最小值下标之后,再执行一次交换操作,你将交换逻辑写在内层循环中,每轮内层遍历都会多次执行无意义的错误交换。
- 内层循环遍历范围错误:选择排序内层循环需要从
修复方案
- 修正交换逻辑:将
a[minind]=a[temp];改为a[minind] = temp;,直接把暂存的a[i]值赋值给minind位置的元素,不需要再通过下标访问数组 - 调整内层循环的范围:将内层循环改为
for(int j = i + 1; j < len; j++) - 将交换逻辑移到内层循环外部,等找到当前轮次的最小值下标后再执行交换
- 可选修正:原输出中的
Shorted为拼写错误,正确写法是Sorted
修正后的完整代码如下:
import java.util.Scanner; public class SelectionShort { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("Enter the length of matrix"); int len=sc.nextInt(); int a[]=new int[len]; System.out.println("Enter the series"); for(int k=0; k<len; k++) { a[k] = sc.nextInt(); } for(int i=0;i<len-1;i++) { int minind=i; // 修正内层循环遍历范围 for(int j=i+1; j<len; j++) { if(a[j] < a[minind]) { minind=j; } } // 修正交换逻辑并移到内层循环外 int temp=a[i]; a[i]=a[minind]; a[minind]=temp; } System.out.println("Sorted array is "); for(int item : a) { System.out.print(item + " "); } sc.close(); } }
内容的提问来源于stack exchange,提问作者prince gujjar
相关产品推荐
相关产品推荐

