我有一个已排序的 JavaScript 数组,并且想在数组中再插入一个项目,以便结果数组保持排序。我当然可以实现一个简单的快速排序风格的插入功能:
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]。
但是,我注意到 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 而言,情况并非一定如此。注意:
- 几种插入算法的最佳情况是 O(n),它仍然与 O(log(n)) 显着不同,但并不像下面提到的 O(n log(n)) 那样糟糕。这将归结为使用的特定排序算法(请参阅Javascript Array.sort implementation?)
 - JavaScript 中的 sort 方法是一个本机函数,因此可能会实现巨大的好处——对于合理大小的数据集,具有巨大系数的 O(log(n)) 仍然可能比 O(n) 差得多。