【问题标题】:Is there a more efficient way to perform a binary insertion sort in JavaScript?有没有更有效的方法在 JavaScript 中执行二进制插入排序?
【发布时间】:2015-02-03 06:58:03
【问题描述】:

要求是从一个空数组开始,向其中插入元素,一次一个,但保持数组按升序排序。它的一个用途是找到一组周期性输入的运行中位数。我尝试过简单地推送一个元素,然后调用内置的排序方法,但似乎(根据其他人在 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,但这似乎是在进行递归搜索,如果没有尾调用优化,这似乎不是最优的。

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

【问题讨论】:

标签: javascript arrays sorting insertion-sort


【解决方案1】:

你应该问自己几个问题:

  1. 我是否需要随时对元素进行排序?
  2. 性能对您来说有多重要?

如果您对问题 1 的回答是否定的,那么我会说继续推送和排序,但不要在每次推送新元素时对其进行排序,而只是在元素插入的最后一个。

如果答案是“是”,那么推送和排序不适合您。 如果是这样,那么我们需要回答问题 2。

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

【讨论】:

    猜你喜欢
    • 2020-12-11
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 2015-10-30
    相关资源
    最近更新 更多