问题描述
当第一个输入是数组中的最小值时,代码工作得很好,而对于所有其他情况,代码抛出 Arrayindexoutofboundsexception -1
测试输入1:6,8,7,11,9(适用于此输入)
测试输入2:10,9,12,1(线程“main”中的异常java.lang.Arrayindexoutofboundsexception:-1)
//SortingMain.java
import java.util.Scanner;
public class SortingMain {
public static void main(String[] args) {
int data[] = new int[5];
Scanner input = new Scanner(system.in);
InsertionSort obj = new InsertionSort();
System.out.println("Enter the numbers in array:");
for(int i=0; i<5;i++) {
data[i]=input.nextInt();
}
obj.insertionSort(data);
System.out.println("Elements after sorting");
for(int i=0; i<5;i++) {
System.out.println(data[i] + ",");
}
input.close();
}
}
//InsertionSort.java
public class InsertionSort {
public void insertionSort(int data[]) {
int i,j,key;
for(i=1;i<data.length;i++) {
key=data[i];
j=i;
while(data[j-1]>key && j>=1) {
data[j] = data[j-1];
j--;
}
data[j] = key;
}
}
解决方法
你的while循环中需要有这样的条件:while (j >= 1 && data[j - 1] > key) { ... }
ie j >= 1
应该首先被检查,只有当它满足时,data[j-1] > key
才应该被检查。
这是因为首先要检查我要从data
访问的索引是否有效,然后再访问它,否则会出现IndexOutOfBoundException
。