У меня есть отсортированный массив 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? )
- Метод сортировки в JavaScript является встроенной функцией, поэтому потенциальная реализация огромных преимуществ - O (log (n)) с огромным коэффициентом все равно может быть намного хуже, чем O (n) для наборов данных разумного размера.