it-swarm.com.de

Warum ist Quicksort in der Praxis besser als andere Sortieralgorithmen?

Dies ist ein Repost eines Frage zu cs.SE von Janoma . Volle Credits und Beute für ihn oder cs.SE.

In einem Standard-Algorithmuskurs wird uns beigebracht, dass Quicksort im Durchschnitt O (n log n) und im schlimmsten Fall O (n²) ist. Gleichzeitig werden andere Sortieralgorithmen untersucht, die im schlimmsten Fall O (n log n) sind (wie Mergesort und Heapsort )) und im besten Fall sogar lineare Zeit (wie bubblesort ), jedoch mit einigen zusätzlichen Speicheranforderungen.

Nach einem kurzen Blick auf einige weitere Laufzeiten ist es natürlich zu sagen, dass Quicksort nicht so effizient sein sollte wie andere.

Bedenken Sie auch, dass die Schüler in grundlegenden Programmierkursen lernen, dass Rekursion im Allgemeinen nicht wirklich gut ist, weil sie zu viel Speicher usw. verbrauchen könnte. Daher (und obwohl dies kein wirkliches Argument ist) gibt dies die Idee, dass Quicksort möglicherweise nicht gut ist wirklich gut, weil es ein rekursiver Algorithmus ist.

Warum übertrifft Quicksort dann in der Praxis andere Sortieralgorithmen? Hat dies mit der Struktur von Daten aus der realen Welt zu tun? Hat es damit zu tun, wie Speicher in Computern funktioniert? Ich weiß, dass einige Erinnerungen viel schneller sind als andere, aber ich weiß nicht, ob dies der wahre Grund für diese kontraintuitive Leistung ist (im Vergleich zu theoretischen Schätzungen).

31
Raphael

Ich würde nicht zustimmen, dass Quicksort in der Praxis besser ist als andere Sortieralgorithmen.

Für die meisten Zwecke ist Timsort - die Mischung aus Mergesort/Insertion-Sortierung, die die Tatsache ausnutzt, dass die von Ihnen sortierten Daten häufig fast sortiert oder umgekehrt sortiert beginnen.

Die einfachste Quicksortierung (kein zufälliger Drehpunkt) behandelt diesen potenziell häufigen Fall als O (N ^ 2) (Reduzierung auf O (N lg N) mit zufälligen Drehpunkten), während TimSort diese Fälle in O (N) behandeln kann.

Nach diesen Benchmarks in C # im Vergleich zum eingebauten Quicksort mit TimSort ist Timsort in den meist sortierten Fällen deutlich schneller und im Fall von Zufallsdaten etwas schneller und TimSort erhält besser, wenn die Vergleichsfunktion besonders langsam ist. Ich habe diese Benchmarks nicht wiederholt und wäre nicht überrascht, wenn Quicksort TimSort für eine Kombination von Zufallsdaten leicht schlagen würde oder wenn die in C # integrierte Sortierung (basierend auf Quicksort) etwas Eigenartiges enthält, das sie verlangsamt. TimSort bietet jedoch deutliche Vorteile, wenn Daten teilweise sortiert werden können, und entspricht in Bezug auf die Geschwindigkeit in etwa der Quicksortierung, wenn die Daten nicht teilweise sortiert sind.

TimSort hat im Gegensatz zu Quicksort den zusätzlichen Vorteil, dass es eine stabile Sorte ist. Der einzige Nachteil von TimSort ist die Verwendung von O(N) gegenüber O (lg N) Speicher in der üblichen (schnellen) Implementierung.

21
dr jimbob

Die schnelle Sortierung wird als schneller angesehen, da der Koeffizient kleiner ist als bei jedem anderen bekannten Algorithmus. Es gibt keinen Grund oder Beweis dafür, nur wurde kein Algorithmus mit einem kleineren Koeffizienten gefunden. Es ist wahr, dass andere Algorithmen auch O (n log n) Zeit haben, aber in der realen Welt ist der Koeffizient auch wichtig.

Beachten Sie, dass für kleine Daten Einfügungssortierung (die als O (n betrachtet wird)2)) ist aufgrund der Art der mathematischen Funktionen schneller. Dies hängt von den spezifischen Koeffizienten ab, die von Maschine zu Maschine variieren. (Am Ende läuft nur Assembly wirklich.) Manchmal ist eine Mischung aus schneller Sortierung und Einfügungssortierung in der Praxis meiner Meinung nach die schnellste.

18
Ramzi Kahil

Quicksort übertrifft nicht alle anderen Sortieralgorithmen. Beispielsweise übertrifft die Bottom-Up-Heap-Sortierung ( Wegener 2002 ) die Quicksortierung für angemessene Datenmengen und ist auch ein In-Place-Algorithmus. Es ist auch einfach zu implementieren (zumindest nicht schwieriger als einige optimierte Quicksort-Varianten).

Es ist einfach nicht so bekannt und man findet es nicht in vielen Lehrbüchern, was erklären könnte, warum es nicht so beliebt ist wie Quicksort.

16
Doc Brown

Sie sollten sich nicht nur auf den schlimmsten Fall und nur auf die zeitliche Komplexität konzentrieren. Es geht mehr um den Durchschnitt als um das Schlimmste, und es geht um Zeit nd Raum.

Schnelle Sorte:

  • hat eine Durchschnitt Zeitkomplexität von Θ ( n log n);
  • kann mit der Raumkomplexität von Θ (log n) implementiert werden;

Berücksichtigen Sie auch, dass die Notation big [~ # ~] o [~ # ~] keine Konstanten berücksichtigt, in der Praxis jedoch einen Unterschied macht, wenn der Algorithmus einige Male schneller ist . Θ ( n log n) bedeutet, dass der Algorithmus in [~ # ~] k [~ # ~] ausgeführt wird n log ( n), wobei [~ # ~] k [~ # ~] konstant ist. Quicksort ist der Vergleichs-Sortier-Algorithmus mit dem niedrigsten [~ # ~] k [~ # ~].

7
vartec

Quicksort ist oft eine gute Wahl, da es relativ schnell und relativ schnell und einfach zu implementieren ist.

Wenn Sie es ernst meinen, große Datenmengen sehr schnell zu sortieren, sind Sie mit einigen Variationen von MergeSort wahrscheinlich besser dran. Dies kann gemacht werden, um den externen Speicher zu nutzen, kann mehrere Threads oder sogar Prozesse verwenden, aber sie sind für den Code nicht trivial.

5
James Anderson

Die tatsächliche Leistung von Algorithmen hängt von der Plattform sowie der Sprache, dem Compiler, der Aufmerksamkeit des Programmierers für Implementierungsdetails, dem spezifischen Optimierungsaufwand usw. ab. Der "konstante Faktorvorteil" von Quicksort ist also nicht sehr genau definiert - es handelt sich um eine subjektive Beurteilung auf der Grundlage der derzeit verfügbaren Tools und eine grobe Schätzung des "äquivalenten Implementierungsaufwands" durch denjenigen, der die vergleichende Leistungsstudie tatsächlich durchführt. .

Trotzdem glaube ich, dass Quicksort (für zufällige Eingaben) eine gute Leistung erbringt, weil es einfach ist und weil seine rekursive Struktur relativ cachefreundlich ist. Auf der anderen Seite muss jede praktische Verwendung eines Quicksorts komplexer sein, als es die Beschreibung des Lehrbuchs anzeigen würde, da der schlimmste Fall leicht auszulösen ist: daher modifizierte Versionen wie Introsort.

Im Laufe der Zeit, wenn sich die dominante Plattform ändert, können verschiedene Algorithmen ihren (schlecht definierten) relativen Vorteil gewinnen oder verlieren. Herkömmliche Erkenntnisse zur relativen Leistung können hinter dieser Verschiebung zurückbleiben. Wenn Sie sich also nicht sicher sind, welcher Algorithmus für Ihre Anwendung am besten geeignet ist, sollten Sie beide implementieren und testen.

1
comingstorm