Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在我的算法中,是否可以使用raw sort()方法对数组进行排序?_Javascript_Arrays_Algorithm_Sorting_Algorithms - Fatal编程技术网

Javascript 在我的算法中,是否可以使用raw sort()方法对数组进行排序?

Javascript 在我的算法中,是否可以使用raw sort()方法对数组进行排序?,javascript,arrays,algorithm,sorting,algorithms,Javascript,Arrays,Algorithm,Sorting,Algorithms,我想知道我是否可以对这个数组进行如下排序: [ 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 ) { re

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

[ 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
功能实现“我的排序算法”?e、 g:

[0, 3, 1, 4, 0].sort(function(previous_value, former_value){
    //code goes here
})
它将得到正确的答案:

[1, 3, 4, 0, 0]

0
赋予更高的优先级
console.log(
[0,3,1,4,0]。排序(函数(a,b){
返回a==b?0:(a==0?1:(b==0-1:a-b));
})

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

function compareNumbers(a, b) {
  if (a === 0) {
   return 1;
  }
  if (b === 0) {
   return -1;
  }
  return a - b;
}
现在只需执行
[0,3,1,4,0].排序(compareNumbers)


只是因为它是用tag标记的,我想说,如果你希望你的数组很大,并且有大量的零,那么创建一个较小的非零元素数组,对它进行排序,并在原始长度上加上零可能是有意义的。

当你已经有了一个解决方案时,你可以对一个伪值使用操作符(如
0
)并给它一个默认值(如
无穷大

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

var数组=[0,3,1,4,0];
array.sort(函数(a,b){
返回(a |无穷大)-(b |无穷大);
});

console.log(array);
这将是我的逻辑短路解决方案

vara=[0,3,1,4,0]。排序((a,b)=>!a&&1||!b&&1|a-b);

console.log(a);
您是否只需要使用排序函数,或者我可以用任何其他方式实现它?我刚刚测试了您的函数,似乎工作正常:您的代码片段令人困惑且不正确。变量名为“previous”和“former”(几乎同义词,令人困惑),您只检查“former”两个
中的一个
分支都应该使用。@user4815162342是的!你说得对。“previous”和“previous”看起来不太好。我只是不想把它们命名为“a”、“b”或“x/y”。我会查出来的!使用传统名称是有原因的——你不能赋予这些元素意义(因为排序算法提供了完全任意的数组成员),所以名称传达了这一点。从某种意义上说,它们实际上只是一些需要比较的a/b/x/y,仅此而已。非常感谢!您的答案也是正确的,但我只能选择答案。干得好!这可能会增加
排序()的步骤数。
:),斯伟,没问题。他跑得更快:-)@PranavCBalan我的观点不是要尽可能简洁,而是要解释我使用比较器到底在做什么以及为什么要这样做。@Salvadodali如果两个值都是
0
它返回
1
,只是增加了步数,如果(a!==b&&a==0)或
如果(b!==0&&a==0)它可以通过
来修正