2011-06-20 34 views
5

我注意到,JavaScript排序函數在9以下的Internet Explorer版本中速度非常慢(與Firefox等相比通常要低一個數量級)我正在實施我自己的版本,看看我能做得更好。合併排序工作得體,但似乎排序算法的大多數文檔假設數組被實現爲連續的內存塊。Javascript數組實現爲對象(至少在舊瀏覽器)排序意識到Javascript表示陣列的獨特方式

我想知道,是否有一個排序算法,考慮到事實數組訪問比平常更昂貴?也就是說,試圖優化不僅是比較的數量,而且數量訪問和創建ne的成本通過像spliceslice這樣的東西來實現。這是我嘗試合併排序。

function mergeSort(array, compareFunc) { 
    if (array.length <= 1) { 
     return; 
    } 
    var mid = Math.floor(array.length/2); 
    var left = array.splice(0, mid); 
    var right = array.splice(0, array.length); 
    mergeSort(left, compareFunc); 
    mergeSort(right, compareFunc); 

    while ((left.length > 0) && (right.length > 0)) 
    { 
     if (compareFunc(left[0], right[0]) <= 0) { 
      array.push(left.shift()); 
     } 
     else { 
      array.push(right.shift()); 
     } 
    } 
    while (left.length > 0) { 
     array.push(left.shift()); 
    } 
    while (right.length > 0) { 
     array.push(right.shift()); 
    } 
    return; 
} 
+0

不是你的問題的直接答案,但底部的這兩個循環應該是'concat's。 – Josh

回答

0

嘗試Web SQL排序功能。認爲這比Javascript中的本地排序更快。如果您正在編寫支持跨瀏覽器兼容性的代碼,則合併排序是一個很好的算法,但請檢查http://www.cs.princeton.edu/~rs/strings/ ..這說明如何使用快速排序和基數排序的汞合金。

如果你能從服務器獲得排序數據,那將是最好的方法。