要求是从一个空数组开始,并一次一个地插入元素,但保持数组按升序排序。使用它可以找到一组周期性输入的运行中值。我试过简单地推送一个元素,然后调用内置的排序方法,但是(通过其他人在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,但这似乎是在进行递归搜索,如果没有尾调用优化,这似乎不是最优的。
另外,最后还有拼接的替代品吗?
答案 0 :(得分:0)
你应该问自己几个问题:
如果您对问题1的回答为否,那么我会说继续进行推送和排序,但每次推送新元素时都不要对它进行排序,而只是在元素插入的最后一个元素。
如果答案是肯定的话那么推送和分拣不适合你。 如果是这种情况,那么我们需要回答问题2.
如果您对问题2的回答是肯定的,那么我会说您应该使用二进制递归算法,或者甚至更好地使用不同的数据结构,一个允许您快速插入以保持排序并且比检索速度更快。那是一棵二叉树!