我感到难以置信。插入排序(基本排序,我知道)算法正在做一些我无法解释的事情



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

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时,如果省略语句描述,while循环不执行,和arr (i2 + 1) =咕咕叫语句并执行,但它将继续在其第一个元素的地方,if语句的存在是如何使第一个元素保持在原来的位置上的,因为它打破了循环,并且没有改变任何东西。

我不确定我是否完全疯了,是否错过了一个正常人无法理解的东西,但我确实看不出遗漏或包含所描述的if语句会改变代码的任何方面,特别是因为i2在for循环的第一次迭代时只会是-1。

非常感谢。

应将break替换为continue

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

continue是正确的武器。

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

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

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

最新更新