为什么“ for”循环的两个类似实现之间有区别?

时间:2019-01-02 09:12:17

标签: java

我正在尝试编写一个插入排序方法,并且已经设法完成它,但是我不明白为什么我的第一个版本无法正常工作。

这是我的第一次尝试:

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)之间的值才是错误的。

1 个答案:

答案 0 :(得分:7)

k + 1 等于i,但仅在内部for循环的第一次迭代中。 int k = i - 1仅在 outer for循环的每次迭代中运行一次。

在内部for循环的第二次迭代中,k递减而i则不递减。因此,k + 1i在内部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]"