排序知道Javascript代表数组的独特方式

时间:2011-06-20 19:48:53

标签: javascript algorithm performance internet-explorer sorting

我注意到Javascript排序功能在9以下的Internet Explorer版本中速度非常慢(与Firefox和其他版本相比,通常是一个数量级。我正在实现自己的版本,看看我能做得更好。合并排序工作正常,但似乎大多数排序算法的文档都假设数组是作为连续的内存块实现的.Javascript数组是作为对象实现的(至少在旧版浏览器中)。

我想知道,有没有一种排序算法考虑到事实数组访问比平常更昂贵?也就是说,不仅要优化比较次数,还要尝试优化数量访问以及通过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;
}

1 个答案:

答案 0 :(得分:0)

尝试Web SQL排序功能。认为这比Javascript中的本机排序更快。如果您正在编写支持跨浏览器兼容性的代码,则合并排序是一个很好的算法,但请检查http://www.cs.princeton.edu/~rs/strings/ ..这说明了使用快速排序和基数排序的混合。

如果您可以从服务器获取排序数据,那将是最好的方法。