问题描述
这是Java中插入排序的简单代码。我尝试减少Java代码的行数。但这不能解决这个问题。我想知道为什么它不能完成。
import java.util.Scanner;
public class InsertionSortModified {
public static int[] insertionSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int temp = arr[i];
int pos = i;
while (pos > 0 && arr[pos-1] > temp)
arr[pos--] = arr[pos-1];
arr[pos] = temp;
}
return arr;
}
public static void main(String args[]) {
Scanner scnr = new Scanner(system.in);
int elementarr[] = new int[5];
for (int j = 0; j < 5; j++)
elementarr[j] = scnr.nextInt();
elementarr = insertionSort(elementarr);
for (int j = 0; j < elementarr.length; j++)
System.out.print(elementarr[j] + " ");
}
}
Exception in thread "main" java.lang.Arrayindexoutofboundsexception: -1
at InsertionSortModified.insertionSort(InsertionSortModified.java:9)
at InsertionSortModified.main(InsertionSortModified.java:22)
while (pos > 0 && arr[pos-1] > temp) {
arr[pos] = arr[pos-1];
pos--;
}
为什么我不能使用
arr[pos--] = arr[pos-1];
解决方法
当您尝试做
test2
并且arr[pos--] = arr[pos-1];
的值为pos
,然后将1
递减为0,然后在pos
的第二种用法中,将其设为pos
在第9行中,您以错误的顺序减少计数器。正确的行是
`arr[pos] = arr[--pos];`
在这里,您正在使用arr [pos]时将其递减,因为您正在减少计数器。之后,pos值已经在正确的位置以插入“ temp”值
,我发现了问题所在。在这里逐步执行代码。
第9行:
当i == 2
时,pos == 2
。在第9行,执行顺序是这样的。
- 在首次执行时,如果while循环为
arr[2] = arr[pos-1]
。 - 定位数组索引2。但是在定位
pos
之后将减小到pos == 1
。 - 然后一行变成
arr[2] = arr[1-1]
的意思是arr[2] = arr[0]
。 - 在那之后,
while
循环仍然是正确的。 - 然后在最初的
arr[1] = arr[pos-1]
处第二次执行while循环。 - 然后定位数组索引1。但是在定位
pos
之后将减小为pos == 0
。 - 然后一行变成
arr[1] = arr[0-1]
的意思是arr[1] = arr[-1]
。 - 所以这里发生错误。 (
ArrayIndexOutOfBounds
。
正确的代码是这样的。 (第9行)
arr[pos--] = arr[pos];
或
arr[pos] = arr[--pos];