Welchen Algorithmus verwendet die JavaScript- Array#sort()
Funktion? Ich verstehe, dass es allerlei Argumente und Funktionen erfordern kann, um verschiedene Arten von Sortierungen durchzuführen. Ich bin einfach daran interessiert, welchen Algorithmus die Vanille-Sortierung verwendet.
javascript
algorithm
arrays
sorting
latortuga
quelle
quelle
Antworten:
Wenn Sie sich diesen Fehler 224128 ansehen , scheint MergeSort von Mozilla verwendet zu werden.
quelle
Ich habe mir gerade die WebKit- Quelle (Chrome, Safari…) angesehen . Abhängig von der Art des Arrays werden verschiedene Sortiermethoden verwendet:
Numerische Arrays (oder Arrays vom primitiven Typ) werden mithilfe der C ++ - Standardbibliotheksfunktion sortiert, die
std::qsort
einige Variationen von Quicksort (normalerweise Introsort ) implementiert .Zusammenhängende Arrays vom nicht numerischen Typ werden mithilfe von Mergesort stringiert und sortiert, sofern verfügbar (um eine stabile Sortierung zu erhalten) oder
qsort
wenn keine Zusammenführungssortierung verfügbar ist.Für andere Typen (nicht zusammenhängende Arrays und vermutlich für assoziative Arrays) verwendet WebKit entweder eine Auswahlsortierung (die sie als "min" -Sortierung bezeichnen ) oder in einigen Fällen eine Sortierung über einen AVL-Baum. Leider ist die Dokumentation hier ziemlich vage, sodass Sie die Codepfade nachverfolgen müssen, um tatsächlich zu sehen, für welche Typen welche Sortiermethode verwendet wird.
Und dann gibt es Edelsteine wie diesen Kommentar :
- Hoffen wir nur, dass jeder, der dies tatsächlich „behebt“, die asymptotische Laufzeit besser versteht als der Verfasser dieses Kommentars und erkennt, dass die Radix-Sortierung eine etwas komplexere Laufzeitbeschreibung hat als einfach O (N).
(Vielen Dank an phsource für den Hinweis auf den Fehler in der ursprünglichen Antwort.)
quelle
Es gibt keine Entwurfsanforderung für JS, ein bestimmtes Sortieralgorthim zu verwenden. Wie viele hier erwähnt haben, verwendet Mozilla die Zusammenführungssortierung. Im Chrome v8-Quellcode werden jedoch ab heute QuickSort und InsertionSort für kleinere Arrays verwendet.
V8 Motorquelle
Von den Linien 807 - 891
Update Ab 2018 verwendet V8 TimSort, danke @celwell. Quelle
quelle
Der ECMAscript-Standard legt nicht fest, welcher Sortieralgorithmus verwendet werden soll. In der Tat bieten verschiedene Browser unterschiedliche Sortieralgorithmen. Zum Beispiel ist Mozilla / Firefoxs sort ( ) beim Sortieren einer Karte nicht stabil (im Sinne des Wortes). IE sort () ist stabil.
quelle
Array.sort
; siehe diese Frage .Nach einigen weiteren Untersuchungen scheint es, dass Array.sort () für Mozilla / Firefox Mergesort verwendet. Siehe den Code hier .
quelle
Ich denke, das hängt davon ab, auf welche Browser-Implementierung Sie sich beziehen.
Jeder Browsertyp hat eine eigene Implementierung der Javascript-Engine, es kommt also darauf an. Sie können die Quellcode-Repos für Mozilla und Webkit / Khtml auf verschiedene Implementierungen überprüfen.
IE ist jedoch eine geschlossene Quelle, sodass Sie möglicherweise jemanden bei Microsoft fragen müssen.
quelle
Ab V8 v7.0 / Chrome 70 verwendet V8 TimSort , den Sortieralgorithmus von Python. Chrome 70 wurde am 13. September 2018 veröffentlicht.
Weitere Informationen zu dieser Änderung finden Sie im Beitrag im V8-Entwicklerblog . Sie können auch den Quellcode oder den Patch 1186801 lesen .
quelle
Die Array.sort () -Funktion von JavaScript verfügt über interne Mechanismen zur Auswahl des besten Sortieralgorithmus (QuickSort, MergeSort usw.) auf der Grundlage des Datentyps der Array-Elemente.
quelle
versuchen Sie dies mit schneller Sortierung:
quelle