好的,听我说完。这是我的插入排序代码。
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/