java - 我很困惑。插入排序(基本排序,我知道)算法正在做一些我无法解释的事情

标签 java insertion-sort

好的,听我说完。这是我的插入排序代码。

        for (int i = 0; i < arr.length; i++) {
            T curr = arr[i];
            int i2 = i - 1;
            // if (i2 == -1) {
            //     System.out.println("yes");
            //     break;
            // } 
            while (i2 >= 0 && comparator.compare(arr[i2], curr) > 0) {
                arr[i2 + 1] = arr[i2];
                i2--;
            }
            arr[i2 + 1] = curr;
        }

所以,截至目前,我有

if (i2 == -1) {
    sout("yes");
    break;
}

因为我想跳过 i2 显然等于 -1 的迭代,因此不会对数组产生单一影响,因为第一次迭代什么都不做,并将第一个元素保留在数组的 0 位置,因为那是插入排序的确切工作原理。

现在,我不太确定发生了什么,因为前面提到的 if 语句被注释掉了,算法完全按预期工作。 但是,当我取消评论时,算法失败了。

我不明白的是,注释掉它,或者根本不包括这个 if 语句,会导致算法失败,因为无论如何,当 i2 == -1 时,就我而言,字面意思是可以看出,对算法没有影响,因为当 i2 为 -1 并且省略了所描述的 if 语句时,while 循环不会执行,而 arr[i2 + 1] = curr 语句会执行,但它只会将第一个元素保留在其位置,确切地说 if 语句的存在如何将第一个元素保留在其位置,因为它打破了循环并且不会改变任何事情。

我不确定我是不是真的疯了,是否遗漏了一些对于一个正常人来说莫名其妙地清楚的东西,但我确实看不出任何一种方式可以说明省略或包含 if 语句会改变代码的任何内容,尤其是因为i2 只会在 for 循环的第一次迭代中为 -1。

非常感谢。

最佳答案

您应该将 break 替换为 continue

因为,在第一次迭代时,它总是 -1 并且它会中断 for 循环,这意味着没有进一步的迭代。

continue 是正确的武器。

if (i2 == -1) {
    sout("yes");
    continue;
}

上面的代码将跳过第一次迭代,而您的代码将终止 for 循环。

但是,不需要这个 if block ,因为您已经在 while 循环的条件下过滤掉第一次迭代。

关于java - 我很困惑。插入排序(基本排序,我知道)算法正在做一些我无法解释的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72751464/

相关文章:

c - 在 C 中从命令行编写插入排序和交换函数

java - JSTL sql :query variable

java - Spring 3.x 应用程序在 Java EE 6 容器中的可行性 - 有时?

java - 使用 ListBlockingQueue 线程的并发运行由于某种原因被阻塞

python - 插入排序: Giving me none when I print

python - Python 中的插入排序代码排序不正确

Java 应用程序停止工作并给出异常

java - IntelliJ 图标在索引项目后发生变化

algorithm - Heapsort交换使用插入排序?

python - 为什么要在解决方案中添加 +1