Ich frage mich nur warum Java
und .NET Framework
verwende standardmäßig einen anderen Sortieralgorithmus.
In Java wird Array.Sort()
standardmäßig der Merge Sort- Algorithmus verwendet, und wie auf Wikipedia.com angegeben :
In Java verwenden die Arrays.sort () -Methoden abhängig von den Datentypen eine Zusammenführungssortierung oder eine optimierte Schnellsortierung. Um die Implementierung effizienter zu gestalten, wechseln Sie zur Einfügungssortierung, wenn weniger als sieben Arrayelemente sortiert werden
In .NET Framework Array.Sort/List.Sort()
verwendet Quick Sort als Standardsortieralgorithmus ( MSDN ):
List.Sort () verwendet Array.Sort, das den QuickSort-Algorithmus verwendet. Diese Implementierung führt eine instabile Sortierung durch. Das heißt, wenn zwei Elemente gleich sind, wird ihre Reihenfolge möglicherweise nicht beibehalten. Im Gegensatz dazu behält eine stabile Sortierung die Reihenfolge der Elemente bei, die gleich sind.
Ein Blick auf die großartige Tabelle "Algorithmenvergleich" zeigt, dass sich beide Algorithmen in Bezug auf Worst Case und Memory Usage sehr unterschiedlich verhalten:
Sowohl Java
und .NET
sind große Frameworks für Enterprise Solutions Entwicklung, sowohl hat Plattformen für Embedded - Entwicklung. Warum verwenden sie also standardmäßig andere Sortieralgorithmen?
Antworten:
So deterministisch Computer auch sind, Computertechnik ist keine exakte Wissenschaft. Zwei Personen mit derselben Problemdomäne führen eine Analyse durch und entwickeln zwei verschiedene Lösungen, die alle Einschränkungen des Problems erfüllen. Es kann schwierig oder unmöglich sein, empirisch zu bestimmen, welches davon im allgemeinen Fall "besser" ist.
Ich vermute, dass .NET QuickSort über etwas in den MFCs oder der Windows-API gelegt ist und wahrscheinlich von viel älteren Windows-Versionen geerbt wurde, bei denen der Multi-Thread-Vorteil von MergeSort nicht einmal für die Computer von in Betracht gezogen worden wäre der Tag. ( BEARBEITEN: Dies ist nicht der Fall, obwohl Microsoft-Entwickler seit langer Zeit QuickSort-Fans sind, wie diese Wahl der Sortierimplementierung seit MS-DOS belegt.)
Java, das keine plattformspezifische Implementierung verwenden kann, weil Java von Grund auf plattformunabhängig entwickelt wurde, ist einen anderen Weg gegangen. Wer weiß, warum MergeSort die Nase vorn hat? Ich gehe davon aus, dass die Implementierung einen Leistungswettbewerb gegen andere von den Entwicklern entwickelte Varianten gewonnen hat, oder dass eine O (n) -space-MergeSort in Bezug auf Best-Case- und Worst-Case-Leistung auf dem Papier einfach am besten aussah (MergeSort hat keine Achillesferse in Bezug auf die Elementauswahl wie QuickSort, und der beste Fall ist eine nahezu sortierte Liste, während dies häufig die schlechteste von QuickSort ist.) Ich bezweifle, dass Multithreading-Vorteile ursprünglich in Betracht gezogen wurden, aber die derzeitige Implementierung kann durchaus Multithreading-Vorteile haben.
quelle
List<T>.Sort
In .NET wird eine systemeigene Methode verwendet, die in der CLR implementiert ist (wenn Sie keinen benutzerdefinierten Vergleicher verwenden), jedoch keine Abhängigkeiten von Betriebssystembibliotheken aufweist.Verschiedene Entwicklungsteams in zwei verschiedenen Unternehmen kamen zu unterschiedlichen Schlussfolgerungen hinsichtlich des üblichen Anwendungsfalls für ihre Frameworks und Komponenten und haben beschlossen, diese entsprechend zu implementieren.
Im Wesentlichen analysierte jedes Unternehmen seinen Kundenstamm und traf entsprechende Entscheidungen.
Es ist nicht zu erwarten, dass verschiedene Unternehmen und Teams Analysen durchführen und dabei unterschiedliche Annahmen und Rohdaten verwenden, um zu derselben Schlussfolgerung zu gelangen.
quelle
Diese Frage ist etwas veraltet, da Java jetzt Timsort verwendet (ab Java 7)
Von den genannten spezifischen Algorithmen:
Quicksort hat eine ungünstige Worst-Case-Leistung bei O (n ^ 2), ist jedoch etwas leichter und speicherintensiver, sodass im Normalfall eine bessere Leistung erzielt wird.
Mergesort hat bei O (n log n) die Worst-Case-Leistung garantiert, hat jedoch etwas mehr Overhead und Speicherbedarf. Es ist auch automatisch stabil (dh behält gleiche Elemente in der gleichen Reihenfolge bei).
Die Java-Designer scheinen im Allgemeinen etwas konservativer zu sein / sich auf das "Richtige" zu konzentrieren, daher ist es nicht verwunderlich, dass sie Mergesort aus den beiden ausgewählt haben, da es bessere Garantien bietet.
Sie sind sich nicht sicher, warum Microsoft sich für Quicksort entschieden hat, obwohl sie dadurch in einigen Micro-Benchmarks besser aussehen würden?
quelle