Ich habe ein sortiertes JavaScript-Array und möchte ein weiteres Element in das Array einfügen, sodass das resultierende Array sortiert bleibt. Ich könnte sicherlich eine einfache Einfügefunktion im QuickSort-Stil implementieren:
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));
[WARNUNG] Dieser Code hat einen Fehler beim Versuch, an den Anfang des Arrays einzufügen, z. B. insert(2, [3, 7 ,9]
) erzeugt falsche [3, 2, 7, 9].
Ich habe jedoch festgestellt, dass Implementierungen der Array.sort-Funktion dies möglicherweise für mich tun können, und zwar nativ:
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));
Gibt es einen guten Grund, die erste Implementierung der zweiten vorzuziehen?
Bearbeiten : Beachten Sie, dass im allgemeinen Fall eine O-Einfügung (log (n)) (wie im ersten Beispiel implementiert) schneller ist als ein generischer Sortieralgorithmus. Dies ist jedoch insbesondere bei JavaScript nicht unbedingt der Fall. Beachten Sie, dass:
- Der beste Fall für mehrere Einfügealgorithmen ist O (n), das sich immer noch erheblich von O (log (n)) unterscheidet, aber nicht ganz so schlecht wie O (n log (n)) ist, wie unten erwähnt. Dies hängt vom jeweiligen verwendeten Sortieralgorithmus ab (siehe Implementierung von Javascript Array.sort? ).
- Die Sortiermethode in JavaScript ist eine native Funktion, sodass potenziell große Vorteile erzielt werden können - O (log (n)) mit einem großen Koeffizienten kann für Datensätze mit angemessener Größe immer noch viel schlechter sein als O (n).
splice()
(z. B. Ihr 1. Beispiel), ist bereits O (n). Selbst wenn intern keine neue Kopie des gesamten Arrays erstellt wird, müssen möglicherweise alle n Elemente um 1 Position zurückgeschoben werden, wenn das Element an Position 0 eingefügt werden soll. Vielleicht ist es schnell, weil es eine native Funktion ist und die Konstante ist niedrig, aber es ist trotzdem O (n).
parseInt
Verwenden Sie Math.floor
stattdessen nicht use . Math.floor
ist viel schneller als parseInt
: jsperf.com/test-parseint-and-math-floor