我有一个已排序的JavaScript数组,并且想在该数组中再插入一个项目,以使结果数组保持排序状态。我当然可以实现一个简单的quicksort样式的插入函数:
var array = [1,2,3,4,5,6,7,8,9]; var element = 3.5; function insert(element, array) { array.splice(locationOf(element, array) + 1, 0, element); return array; } function locationOf(element, array, start, end) { start = start || 0; end = end || array.length; var pivot = parseInt(start + (end - start) / 2, 10); if (end-start <= 1 || array[pivot] === element) return pivot; if (array[pivot] < element) { return locationOf(element, array, pivot, end); } else { return locationOf(element, array, start, pivot); } } console.log(insert(element, array));
[警告] 尝试插入到数组的开头时,此代码存在错误,例如insert(2, [3, 7 ,9])会产生不正确的[3,2,7,9]。
insert(2, [3, 7 ,9]
但是,我注意到Array.sort函数的实现可能会为我本机执行以下操作:
var array = [1,2,3,4,5,6,7,8,9]; var element = 3.5; function insert(element, array) { array.push(element); array.sort(function(a, b) { return a - b; }); return array; } console.log(insert(element, array));
是否有充分的理由选择第一个实现而不是第二个实现?
编辑 :请注意,对于一般情况,O(log(n))插入(如第一个示例中所实现)将比通用排序算法更快;但是对于JavaScript来说并不一定如此。注意:
就像一个数据点一样,我通过Windows7上的Chrome使用两种方法,对踢出1000个随机元素到100,000个预排序数字数组中进行了测试:
First Method: ~54 milliseconds Second Method: ~57 seconds
因此,至少在此设置中,本机方法无法弥补这一不足。即使对于小型数据集,也是如此(将100个元素插入1000个数组中):
First Method: 1 milliseconds Second Method: 34 milliseconds