2011-05-10 50 views
1

通常這雙比較結果排序時,你做的事:優化的JavaScript排序

if (x < y) return -1 
else if (x > y) return 1 
else return 0 

return ((x > y) ? 1 : ((x < y)) ? -1 : 0)) 

兩個比較什麼似乎只能與一個來完成。在彙編中,你所要做的就是將兩者都減去一個寄存器,檢查是否爲負數,檢查是否爲零。如果我們要減去的話,問題出現在javascript中:

var sub = (x - y); 
return (sub == 0 ? 0 : ((sub < 0) ? -1 : 1)) 

這將會導致更多的代碼被執行。

因此,一些問題:

  • 有簡化或在JavaScript speedying這種方式?
  • 像chrome這樣的編譯javascript解碼器能優化這種比較嗎?
  • 其他語言怎麼樣?

回答

2

在Javascript中,sort不必返回-101。它可以返回任何數字。這意味着你只需要從另一個數中減去一個數來比較它們。

MDC docs for Array.sort表明此實現:

function compareNumbers(a, b) 
{ 
    return a - b; 
} 

var nums = [34, 56, 1, 42, 63]; 
nums.sort(compareNumbers); 
// [1, 34, 42, 56, 63] 
+0

請注意,這只是工作可靠,因爲JavaScript是採用雙打(好,我認爲它的工作可靠,與雙打,你不能太肯定)而相同的代碼**不會**對用2s補碼編碼的整數正確工作! – Voo 2011-05-10 23:54:02

1

通常排序算法不是專門爲-1或+1看,只是< 0或> 0。 在這種情況下,比較功能可以像

return x - y ; 
1

按字母順序排序一樣簡單可以用的Array.sort()來完成的,但如果你想有一個情況下不敏感那種你需要測試,如果字符串相同,或者如果一個大於或小於另一個。

array.sort(function(a,b){ 
    a=a.toLowerCase(); 
    b=b.toLowerCase(); 
    if(a==b) return 0; 
    return a>b? 1:-1; 
} 

擔心一個額外的比較是在這裏旁邊,轉換toLowerCase是吃的週期。所以,除非你需要,否則不要使用低價箱。

數字,如已被證明是簡單 -

array.sort(function(a,b){ return a-b});