问问各位,为什么下面插入排序代码如果将temp< r[j]写在&&前面就会报错
但是如果把j >= 0 写在前面就能正常运行
不知道那一步出错了
知道逻辑与有个短路效应
public class InsetSort {
public void InsertSort(int[] r,int n) {
int temp, j;
for(int i = 1; i<n ; i++) { //第一个数组元素不用排序,从第二个元素开始
temp = r[i]; //数组下标为0的元素是哨兵,用来存储待插入元素
for( j = i-1 ; temp < r[j] && j >= 0 ; j--) {//分别寻找待插入元素之前的数组元素与待插入元素的关系
//逻辑与具短路效果,第一个只要为假就不再对后面进行运算
r[j+1]=r[j]; //将元素后移
}
r[j+1]=temp;
}
}
}
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at SuanFa.InsetSort.InsertSort(InsetSort.java:9)
at SuanFa.Test.main(Test.java:12)
都没说到重点。。。
for( j = i-1 ; temp < r[j] && j >= 0 ; j--) {
这个是你的代码,当 i 初始值为 1时,j 从0开始;
当 j 为0,第一次满足条件,for 循环执行,最后会 j--,这个时候 j 变成了-1;
再次进入判断条件时,temp < r[-1],这不就越界了
&&先判断左边,左边为否右边就不运算了。
你把这个写到左边,若果j等于-1不就下标越界了
知道短路效应还不简单?必须先判断越界再访问