我在循环中的if语句中做了什么?

时间:2017-01-28 12:15:24

标签: java arrays loops

为什么我们必须在下面的片段中减少计数器?

该程序将数组从最大到最低排序。递减会对循环计数器产生影响吗?

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
       }
 }

4 个答案:

答案 0 :(得分:4)

如果您怀疑iif的递减是不必要的,那么您是对的:可以安全删除它。

代码的作者在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

这会导致额外的循环,这会增加代码的运行时间。最好使用一种流行的排序算法来获得最佳结果。