使用for循环对数组进行排序失败

时间:2017-07-18 19:18:52

标签: javascript arrays loops sorting numbers

为了好玩,我在CheckiO上启动了一些JavaScript。中等任务我遇到了问题。首先,我尝试使用for循环对给定数组进行排序。为了在循环期间看到数组,我使用了console.log

for (var i = 0; i < data.length-1; i++) {
    if (data[i] > data[i+1]) {
        var temp = data[i];
        data[i] = data[i+1];
        data[i+1] = temp;
        i = 0;
    }
    console.log(data);
}

问题是当错误的位置只有一个数字时;排序停止,只打印几次数组。 例如:

median([5,4,3,2,1])
[ 4, 5, 3, 2, 1 ]
[ 4, 3, 5, 2, 1 ]
[ 4, 3, 5, 2, 1 ]
[ 4, 3, 2, 5, 1 ]
[ 4, 2, 3, 5, 1 ]
[ 4, 2, 3, 5, 1 ]
[ 4, 2, 3, 5, 1 ]
[ 4, 2, 3, 1, 5 ]
[ 4, 2, 3, 1, 5 ]
[ 4, 2, 1, 3, 5 ]
[ 4, 1, 2, 3, 5 ]
[ 4, 1, 2, 3, 5 ]
[ 4, 1, 2, 3, 5 ]
[ 4, 1, 2, 3, 5 ]

这种行为有什么解释吗?谢谢!

4 个答案:

答案 0 :(得分:1)

在JavaScripts Array原型对象上为您实现了一个很棒的排序功能。

http://vim.wikia.com/wiki/VimTip91

但是,我打赌你知道这一点,并且正在实现此代码用于学习目的。

您的版本中的错误与此变量i

的递增有关

相反,试试这个:

var i = 0;
while(i < data.length) {
  if(data[i] > data[i + 1]) {
    var temp = data[i];
    data[i] = data[i + 1];
    data[i + 1] = temp;
    i = 0;
    continue;
  }

  i += 1;
}

由于我们不知道所需的迭代次数,因此使用while循环而不是for循环更为合适和清晰。这样,代码就清晰了,只有在逻辑i语句的计算结果为false时才会增加if

答案 1 :(得分:0)

你的代码失败了,因为即使你在if块中生成docker run -p 80:80 nginx ,迭代完成后我也会增加并变为1,所以它再也不会检查数据[0]。 你可以这样做:

i=0

答案 2 :(得分:0)

您编写的代码看起来很好,但由于循环迭代为i值添加+1,因此它不会检查第一个元素。

要解决此问题,只需设置i = -1;而不是i = 0;

median([5,4,3,2,1]);

function median(data) {
  for(var i = 0; i < data.length-1; i++) {
  		//console.log(i, data[i], data[i+1], data);
      if(data[i]>data[i+1]) {
          var temp = data[i];
          data[i] = data[i+1];
          data[i+1] = temp;
          i=-1; // Reset iterator so it is back to 0 on the next loop.
      }
      console.log(data);
  }
}

编辑:我在代码段中添加了注释掉的代码行。如果取消注释并注释其他console.log,您将获得控制台的输出,显示您所在的索引,该索引的值,您将其与之比较的索引处的值,然后是当前数组的状态。尝试将-1更改为0并查看它与重置为-1的区别。

答案 3 :(得分:0)

var a =[ 4, 5, 3, 2, 1 ];
var b =[ 4, 3, 5, 1, 2 ];
var c =[ 5, 3, 4, 2, 1 ];


function mySort(inArray) {
    return inArray.sort(function(x,y) { return x>y ? 1 : -1});
}

console.log( mySort(a) );
console.log( mySort(b) );
console.log( mySort(c) );

这就是你要找的东西吗?