按偶数和奇数排序数组

使用javascript sort()方法,我试图对列表进行排序,但排序有一组偶数和奇数。

我尝试的代码与小列表工作正常,但如果列表变大,它不会得到我正确的结果。 这是我的代码。

 var n = [10,20,21,4,5,6,7,99,0,12,13]; //var n = [10,20,0,12]; n.sort(function(a,b){ if (a % 2 !=b % 2 ){ return a%2; }else {  return a - b; } }); 

上面的代码给出了我的接受结果,如这个Ans – [0, 4, 6, 10, 12, 20, 5, 7, 13, 21, 99] 0,4,6,10,12,20,5,7,13,21,99 [0, 4, 6, 10, 12, 20, 5, 7, 13, 21, 99] ,第二个Ans是: – [0, 10, 12, 20] 0,10,12 [0, 10, 12, 20]

使用此列表工作正常,但如果我改变了这个

 var n = [10,20,21,4,5,6,7,99,0,12,13,10,20,21,4,5,6,7,99,0,12,13,10,20,21,4,5,6,7,99,0,12,13,10,20,21,4,5,6,7,99,0,12,13]; 

但在这种情况下,结果是这样的,这是不恰当的。

给我这样的答案

[0, 0, 0, 0, 4, 4, 4, 4, 6, 6, 6, 6, 10, 10, 10, 10, 12, 5, 12, 5, 12, 5, 20, 20, 20, 20, 5, 12, 7, 7, 7, 7, 13, 13, 13, 13, 21, 21, 21, 21, 99, 99, 99, 99]是奇数和偶数的混合。

它给了我不正确的结果。 任何建议。

最短的时间:

 n.sort(function(a, b) { return a % 2 - b % 2 || a - b; }); 

为了使其与负数一起使用,我们可以添加Math.abs()

 n.sort(function(a, b) { return Math.abs(a % 2) - Math.abs(b % 2) || a - b; }); 

或者使用按位AND的更紧凑的变体:

 n.sort(function(a, b) { return (a & 1) - (b & 1) || a - b; }); 

更改代码如下:

 n.sort(function(a,b){ if (a % 2 != b % 2 ){ return a%2; }else { return (a - b) > 0 ? 1 : -1; } }); 

工作样本在这里 。

编辑:

 n.sort(function(a,b){ if (a % 2 != b % 2 ){ return a%2 == 0 ? -1 : 1; // this is the fix :) }else { return (a - b) > 0 ? 1 : -1; } }); 

编辑2:我修改了负数的代码。 见工作样本 。

 n.sort(function(a,b){ if (a % 2 != b % 2 ){ return Math.abs(a)%2; }else { return a > b ? 1 : -1; } }); 

我的尝试:

小提琴

 var n = [10,20,21,4,5,6,7,99,0,-12,12,13,-45,10,20,21,-13,4,5,6,7,99,0,12,13,10,-99,20,21,4,5,6,7,99,0,12,13,10,20,21,4,5,6,7,99,-15,-18,0,12,13]; function sort(a, b) { if (!(a % 2) && !(b % 2)) { return a > b ? 1 : -1; } if ((a % 2) && (b % 2)) { return a > b ? 1 : -1; } if ((a % 2) && !(b % 2)) { return 1; } return -1; } console.log(n.sort(sort));​