【问题标题】:Execution stops after the first iteration of the outter loop外循环第一次迭代后执行停止
【发布时间】:2016-08-18 07:20:23
【问题描述】:
var array = [5,3,4,1]

for(var x = 0; x < array.length; x++){

    for(var y = array.length - 1; y >= x; y--){

        if(array[x] > array[y]){
          var temp = array[y];
          array[y] = array[x];
          array[x] = temp; 
    }
  }
}
console.log(array); 

//Output : [1,3,4,5]

我知道循环是为了交换循环,如果 x 大于 y,循环本质上就是交换两个值。

[1,3,4,5] 是 x = 0 时的结果,但是 为什么一旦 x = 1 什么都没有改变,等等?第二个for循环不应该通过它的迭代运行并继续交换值直到第一个循环到达array.length(4)?

编辑:关于我的思考过程的更多信息: 第一次迭代后的输出是[1,3,4,5],但是当它迭代到x = 1时呢?那时,x[1] = 3,对吗?当 y 从 5 递减到 4 到 3,但 3 > 1 时,if 语句失败,因此我认为输出更改为 [3,1,4,5]。此时 x 迭代到 x[2],即 4,输出变为 [4,3,1,5],最后,x[3] = 5,不再可能进行交换

【问题讨论】:

  • 是什么让您认为它没有一直运行? (在这个特定的例子中,它不需要,因为数组是在第一次迭代时排序的......)
  • 我的错误。我知道它一直在运行,我只是不明白为什么第一次迭代后没有任何变化。
  • 没有任何变化,因为没有任何东西通过 if 语句。通读一些关于编程的教程,这种东西很早就会出现。

标签: javascript arrays for-loop scope iteration


【解决方案1】:

不明白你所说的进程停止是什么意思。以下是您的代码的修改版本

var array = [5,3,4,1]
var count = 0, swap = 0;
for(var x = 0; x < array.length; x++){
    for(var y = array.length - 1; y >= x; y--){
        count++;
        if(array[x] > array[y]){
          swap++;
          var temp = array[y];
          array[y] = array[x];
          array[x] = temp; 
    }
  }
}
console.log('count', count, 'swap', swap,'array',array); 

count 10 交换 1 个数组 [1, 3, 4, 5]

代码是一个简单的从小到大的交换排序算法。第一次交换后,数组完全排序,因此不再发生交换。循环确实运行了 10 次。

【讨论】:

  • 我很抱歉这么密集,但为什么没有进一步的交换发生?第一次迭代后的输出是[1,3,4,5],但是当它迭代到x = 1时呢?那时,x[1] = 3,对吗?当 y 从 5 递减到 4 到 3,但 3 > 1 时,if 语句失败,因此我认为输出更改为 [3,1,4,5]。此时 x 迭代到 x[2],即 4,输出变为 [4,3,1,5],最后,x[3] = 5,不再可能进行交换。
  • 当 x=1 时,y = {3,2,1}(不是 {3,2,1,0})和 array[y] = {5,4,3}(再次,不是 {5,4,3,1},因为当 y
最近更新 更多