有没有更有效的方法在JavaScript中执行二进制插入排序?

时间:2015-02-03 06:58:03

标签: javascript arrays sorting insertion-sort

要求是从一个空数组开始,并一次一个地插入元素,但保持数组按升序排序。使用它可以找到一组周期性输入的运行中值。我试过简单地推送一个元素,然后调用内置的排序方法,但是(通过其他人在jsPerf上完成的一些基准测试)出现了大量元素的减速。

允许重复(虽然一个简单的技巧也让我不允许它们。)

function binaryInsert(x, array) {
    var l = 0,
        r = array.length - 1,
        m;
    while (l <= r) {
        m = (l + r) / 2 | 0;
        if (array[m] > x) {
            r = m - 1;
            continue;
        }
        l = m + 1;
        if (array[m] === x) {
            break; // change to return to avoid duplicates
        }
    }
    array.splice(l, 0, x);
}

我确实看过this,但这似乎是在进行递归搜索,如果没有尾调用优化,这似乎不是最优的。

另外,最后还有拼接的替代品吗?

1 个答案:

答案 0 :(得分:0)

你应该问自己几个问题:

  1. 我是否需要随时对元素进行排序?
  2. 对你来说表现有多重要?
  3. 如果您对问题1的回答为否,那么我会说继续进行推送和排序,但每次推送新元素时都不要对它进行排序,而只是在元素插入的最后一个元素。

    如果答案是肯定的话那么推送和分拣不适合你。 如果是这种情况,那么我们需要回答问题2.

    如果您对问题2的回答是肯定的,那么我会说您应该使用二进制递归算法,或者甚至更好地使用不同的数据结构,一个允许您快速插入以保持排序并且比检索速度更快。那是一棵二叉树!