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都在最后李>
- 所有正数都按升序排序
[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)它可以通过来修正