2012-10-30 55 views
1

使用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; 
 } 
}); 

上面的代碼給我按這樣 答接受的結果 - [0, 4, 6, 10, 12, 20, 5, 7, 13, 21, 99]和第二答案是: - [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]其奇數和偶數的混合。

它給我不正確的結果。任何建議。

+3

請定義,「不正確的結果」 – SpYk3HH

+3

請所需的輸出增加了問題的身體。 – VisioN

回答

11

短的最短:採用更加緊湊的變體bitwise AND

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

或者:

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

,使其與負數的工作,我們可以添加Math.abs()

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

這就是我要找的謝謝@VisioN。 – Soarabh

+1

那簡短的版本很漂亮:) – Alnitak

+1

幹得好!我開始寫一個答案,但只要我看到這個就放棄了。優雅和正確。 –

1

更改代碼如下:

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

工作樣品是here

編輯:

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: 我體改爲負數的代碼。請參閱working sample

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

不按照接受的結果。結果是奇數和偶數的混合:( – Soarabh

+0

)你是對的,我需要編輯 – Zafer

0

我嘗試:

fiddle

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