【问题标题】:is it possible to sort an Array in my algorithm using the raw sort() method?是否可以使用原始 sort() 方法在我的算法中对数组进行排序?
【发布时间】:2017-04-03 20:58:02
【问题描述】:

我想知道我是否可以像这样对这个数组进行排序:

[ 0 ,3, 1, 4, 0 ] =>   [ 1, 3, 4, 0, 0] 

详细规则:

  • 数组包含 0 和正数。
  • 最后都是0。
  • 所有正数按升序排列。

一开始,我使用了js的原始排序功能,比如:

[0, 3, 1, 4, 0].sort(function(previous_value, former_value){
  if(previous_value == 0 && former_value != 0 ) {
      return 1;
    }else if (former_value == 0 && former_value != 0) {
      return -1;
    }else if (former_value == 0 && former_value == 0) {
      return 0;
    }else{
      return previous_value - former_value;
  }
})

但是,我失败了。我想知道是否可以使用sort 函数实现“我的排序算法”?例如:

[0, 3, 1, 4, 0].sort(function(previous_value, former_value){
    //code goes here
})

它会得到正确答案:

[1, 3, 4, 0, 0]

【问题讨论】:

  • 你需要它只使用排序功能,还是我可以用其他方式实现它?
  • 我刚刚测试了您的功能,似乎按预期工作:jsfiddle.net/mrlew/j5qbcgch
  • 您的代码 sn-p 令人困惑且不正确。这些变量被命名为“previous”和“former”(几乎是同义词,令人困惑),并且您只检查了两个 else if 分支中的“前”一个,您应该同时使用这两个分支。
  • @user4815162342 是的!你说的对! “以前的”和“以前的”看起来不太好。我只是不想将它们命名为“a”、“b”或“x/y”。我去看看!
  • 传统名称是有原因的——你不能为这些元素分配含义(因为排序算法给了你完全任意的数组成员),所以名称传达了这一点。从某种意义上说,它们实际上只是一些你需要比较的 a/b/x/y,仅此而已。

标签: javascript arrays algorithm sorting


【解决方案1】:

0 赋予更高的优先级

console.log(
  [0, 3, 1, 4, 0].sort(function(a, b) {
    return a === b ? 0 : (a === 0 ? 1 : (b === 0 ? -1 : a - b));
  })
);

扩展if条件

console.log(
  [0, 3, 1, 4, 0].sort(function(a, b) {
    if (a === b)
      return 0;
    if (a === 0)
      return 1;
    if (b === 0)
      return -1;
    return a - b;
  })
);

【讨论】:

    【解决方案2】:

    您只需强制比较器将 0 视为最高数字。

    function compareNumbers(a, b) {
      if (a === 0) {
       return 1;
      }
      if (b === 0) {
       return -1;
      }
      return a - b;
    }
    

    现在你只需要[0, 3, 1, 4, 0].sort(compareNumbers)

    仅仅因为它被标记为 标签,我会说如果你希望你的数组很大并且有很多零,那么创建一个较小的非零元素数组可能是有意义的,对它进行排序并将零附加到原始长度。

    【讨论】:

    • 非常感谢!你的答案也是正确的,但我只能选择答案。干得好!
    • 这可能会增加sort() 中的步数 :) , jsfiddle.net/9rxnddbw
    • 四味,没问题。他更快:-)。 @PranavCBalan 我的意思不是尽可能简洁,而是要解释我到底在用比较器做什么以及为什么要这样做。
    • @SalvadorDali 如果两个值都是0,则返回1,只是增加了步数,可以通过if (a !== b && a === 0)if (b !== 0 && a === 0)修复
    【解决方案3】:

    这将是我的逻辑短路解决方案

    var a = [0, 3, 1, 4, 0].sort((a,b) => !a && 1 || !b && -1 || a-b);
    console.log(a);

    【讨论】:

      【解决方案4】:

      虽然您已经有了解决方案,但您可以使用 logical OR 运算符来获取虚假值(如 0)并为其指定默认值(如 Infinity)。

      这会将零移动到末尾,因为默认值大于所有其他值。

      var array = [ 0 ,3, 1, 4, 0 ];
      
      array.sort(function (a,b) {
          return (a || Infinity) - (b || Infinity);
      });
      
      console.log(array);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-20
        • 1970-01-01
        • 1970-01-01
        • 2023-01-27
        • 2017-03-19
        • 2022-01-12
        • 1970-01-01
        相关资源
        最近更新 更多