我正在尝试编写一个插入排序方法,并且已经设法完成它,但是我不明白为什么我的第一个版本无法正常工作。
这是我的第一次尝试:
public static void insertionSort(int[] list) {
for (int i = 1; i < list.length; i++) {
int current = list[i];
for (int k = i - 1; k >= 0 && current < list[k]; k--) {
list[i] = list[k];
list[k] = current;
}
}
}
public static void main(String[] args) {
int[] list = {8, 22, 90, 10};
insertionSort(list);
}
上面代码的输出是:8、10、10、22
但是,如果将第5行的内部for循环从list[i] = list[k];
更改为:list[k + 1] = list[k];
据我了解,k + 1
等于i
,但是循环计数必须不同,我不知道该怎么做。我尝试了很多输入,但是只有位于两个第一个索引范围(在本例中为8和22)之间的值才是错误的。
答案 0 :(得分:7)
k + 1
等于i
,但仅在内部for循环的第一次迭代中。 int k = i - 1
仅在 outer for循环的每次迭代中运行一次。
在内部for循环的第二次迭代中,k
递减而i
则不递减。因此,k + 1
和i
在内部for循环内不可互换。
// second iteration of the outer for loop, second iteration of the inner for loop:
list[i] = list[k]; // means "list[2] = list[0]
// whereas
list[k + 1] = list[k]; // means "list[1] = list[0]"