2011-05-10 48 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});