【问题标题】:Sorting an array with for loop failed使用 for 循环对数组进行排序失败
【发布时间】:2017-07-18 19:18:52
【问题描述】:

为了好玩,我在 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 ]

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

【问题讨论】:

  • 排序需要手动滚动还是可以使用data.sort(); 并完成?
  • 我修改了一些答案,以确保您理解并可以看到您的代码和我的代码有何不同。我认为您对这种排序循环的想法既简单又好,但需要一点调试帮助才能达到终点。我希望我的回答不仅能提供解决方案,还能让您自己了解如何在控制台中看到错误并更好地调试。
  • idnamzciv,请选择一个答案。已经提供了许多很棒的解决方案,并且通过我的测试,所有解决方案都将提供合适的解决方案。

标签: javascript arrays loops sorting numbers


【解决方案1】:

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

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

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

您版本中的错误与此变量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 循环更为合适和明确。这样,代码就很清晰了,只有当逻辑 if 语句的计算结果为 false 时,i 才会递增。

【讨论】:

  • 我喜欢你用这个解决方案所做的。在我的版本中,我设置了 i = -1,但 continue 实际上处理得很好,如果您的代码由多个用户处理,可能会更有意义,而无需评论以确保有人不会破坏您的工作。做得很好。
【解决方案2】:

您的代码失败了,因为即使您在 if 块中创建 i=0,在迭代完成后,我也会递增并变为 1,因此它不会再次检查 data[0]。 你可以这样做:

var data = [5,4,3,2,1];

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

【讨论】:

    【解决方案3】:

    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) );

    这就是你要找的吗?

    【讨论】:

      【解决方案4】:

      您编写的代码看起来不错,只是它不检查第一个元素,因为循环迭代将 +1 添加到 i 值。

      要解决此问题,只需设置您的 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);
        }
      }

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-14
        • 1970-01-01
        • 2022-06-14
        • 1970-01-01
        • 2018-08-23
        • 1970-01-01
        • 1970-01-01
        • 2013-07-09
        相关资源
        最近更新 更多