为什么我们必须在下面的片段中减少计数器?
该程序将数组从最大到最低排序。递减会对循环计数器产生影响吗?
int temp;
for (int i = 0; i < array.length-1; i++) {
if(array[i] < array[i+1]) {
temp=array[i];
array[i]=array[i+1];
array[i+1]=temp;
i--; // <<== This line
}
}
答案 0 :(得分:4)
如果您怀疑i
中if
的递减是不必要的,那么您是对的:可以安全删除它。
代码的作者在i
语句中递减if
的原因是为了“撤消”循环头中增量的影响,以防需要额外的交换。但是,条件保证下一次if
将会失败,因此删除减量是安全的。例如,如果你只是因为2 < 5
交换了2和5,那么你不将交换5和2,所以让循环移动到下一个索引是安全的。
答案 1 :(得分:1)
正如@dasblinkenlight已经说过的那样,i--
语句是不必要的,但并非全部。 i--
有一个目的,但由于程序员犯了错误,排序算法不起作用。让我解释一下:
算法遍历一个数组并交换两个数字,如果它们的顺序错误。如果交换了两个数字,算法必须后退一步,因为较大的数字可能比之前的数字更大。例如:
[7 3 11 2 3 5 6 5]
首先,比较7和3。由于它们已经是正确的顺序,算法进行到3和11.这些交换,所以新的顺序是
[7 11 3 2 3 5 6 5]
现在算法必须回到campare 7和11,因为11应该是第一个数字。这就是为什么代码中有i--
的原因。程序员忘记的是 i后来增加,所以在下一次迭代中我有与以前相同的值。为了使它工作,你必须递减2 。这意味着你必须检查我是否是否定的。
这是工作代码:
int temp;
for (int i = 0; i < array.length-1; i++) {
// If i is negative, this should be skipped.
if (i != -1 && array[i] < array[i+1]) {
temp = array[i];
array[i] = array[i+1];
array[i+1] = temp;
i -= 2;
}
}
现在数组已正确排序:[11 7 6 5 5 3 3 2]
答案 2 :(得分:0)
这是使用冒泡排序算法继续迭代所有项目所必需的。你想在这里理解什么?
答案 3 :(得分:0)
似乎使用较少。如果数组包含{1,2,3},则执行如下:
第一次循环:i = 0
array [0]&lt;数组[1]&gt;&gt; 1&lt; 2
temp = 1,array [0] = 2,array [1] = 1,i = 0
第二次循环:i = 0
这会导致额外的循环,这会增加代码的运行时间。最好使用一种流行的排序算法来获得最佳结果。