Wie wir wissen, ist die Quicksort-Leistung im Durchschnitt O (n * log (n)), aber die Merge- und Heapsort-Leistung ist auch O (n * log (n)) im Durchschnitt. Die Frage ist also, warum Quicksort im Durchschnitt schneller ist.Warum ist Quicksort im Durchschnitt schneller als andere?
Antwort
Worst Case für schnelle Sortierung ist eigentlich schlechter als Heapsort und Mergesort, aber Quicksort ist im Durchschnitt schneller.
Wie, warum, wird es einige Zeit dauern, zu erklären und somit werde ich beziehen sich auf Skiena, The algorithm design manual.
Ein Zitat, das die quicksort vs merge/Heapsort fasst zusammen:
Wenn mit Algorithmen der gleichen asymptotisch konfrontiert Komplexität, Implementierung Details und Systemquirks wie Cache-Performance und Speichergröße Mai gut als der entscheidende Faktor erweisen. Was wir sagen können, ist, dass Experimente zeigen, dass, wo ein richtig implementiert Quicksort gut implementiert ist, es in der Regel 2-3 mal schneller als Mergesort oder Heapsort ist. Der Hauptgrund ist, dass die Operationen in der innersten Schleife einfacher sind. Aber ich kann nicht mit dir streiten, wenn du mir nicht glaubst, wenn ich sage, Quicksort ist schneller. Es ist eine Frage, deren Lösung außerhalb der analytischen Werkzeuge liegt, die wir verwenden. Der beste Weg zu erzählen ist, sowohl Algorithmen und Experiment zu implementieren.
Typischerweise quicksort signifikant ist in der Praxis schneller als andere O (n log n) Algorithmen, weil seine innere Schleife kann effizient auf den meisten Architekturen implementiert werden, und in den meisten realen Welt Daten, ist es möglich, Design Entscheidungen, die die Wahrscheinlichkeit der quadratischen Zeit zu minimieren. Darüber hinaus neigt Quicksort zu ausgezeichnete Nutzung des Speichers Hierarchie, die perfekte Nutzung von virtuellen Speicher und verfügbaren Caches. Obwohl quicksort kein In-Place ist und verwendet Hilfsspeicher, ist es sehr gut geeignet für moderne Computer Architekturen.
Werfen Sie einen Blick auf comparison with other sorting algorithms auf der gleichen Seite.
Siehe auch Why is quicksort better than other sorting algorithms in practice? auf der CS-Site.
Wissen Sie, wie genau es "virtuellen Speicher und Cache nutzt"? Irgendein Beispiel? – Michael
Wenn Sie versuchen, in Bezug auf den Algorithmus selbst zu denken, kümmern Sie sich nicht um virtuellen Speicher und Cache. Algorithmen verlassen sich nicht auf Hardware. – DarthVader
Der Algorithmus durchquert sequentiell, was eine gute "Referenzlokalität" (http: //en.wikipedia.org/wiki/Locality_of_reference), wodurch Ihr Cache gut funktioniert (und somit die Arbeit beschleunigt) – ChristopheD
Timsort könnte eine better Option sein, wie es für die Art von Daten optimiert ist, die beim Sortieren im Allgemeinen in der Python-Sprache gesehen werden, wo Daten oft eingebettete "Läufe" vorsortierter Elemente enthalten. Es wurde kürzlich auch von Java übernommen.
+1 für die interessante Verbindung nach Timsort. –
- 1. Warum ist die Vektorisierung im Allgemeinen schneller als Schleifen?
- 2. Warum Join ist schneller als normale Verkettung
- 3. Warum ist string.IsNullOrEmpty schneller als ein Vergleich?
- 4. Warum ist String.IsNullOrEmpty schneller als String.Length?
- 5. Warum ist ToUpperInvariant() schneller als ToLowerInvariant()?
- 6. Warum ist Python schneller als Ruby?
- 7. Warum Neo4j ist schneller als SQL
- 8. Warum ist float() schneller als int()?
- 9. Warum ist MSMQ schneller als WCF QueueService?
- 10. Warum ist HashMap schneller als HashSet?
- 11. Warum ist Core Data schneller als SQLite
- 12. Warum ist \% (\) schneller als \ (\) in Vim?
- 13. Warum ist file_get_contents() schneller als mit fsock_open()?
- 14. Warum ist Crystal schneller als Ruby?
- 15. Warum ist numpy.dot viel schneller als numpy.einsum?
- 16. Warum emplace_back ist schneller als push_back?
- 17. Warum ist String.equals() schneller als sich selbst?
- 18. Warum PathPing ist schneller als Tracert?
- 19. Warum strings.HasPrefix ist schneller als bytes.HasPrefix?
- 20. Warum läuft meine eine Entschlüsselungsmethode viel schneller als die andere?
- 21. Ist + = schneller als - =?
- 22. Ist `extend` schneller als` + = `?
- 23. Ist eine dieser For-Schleifen schneller als die andere?
- 24. Warum ist `-1 * x` schneller als` -x` und warum?
- 25. Warum int32_t schneller als int64_t?
- 26. Warum ist std :: mutex schneller als std :: atomic?
- 27. Warum ist plt.imshow so viel schneller als plt.pcolor?
- 28. Warum ist Publizieren in XNA schneller als Release?
- 29. Warum ist C in Codeausführung schneller als C++?
- 30. Warum ist R-Code mit `{}` schneller als mit `()`?
Heapsort ist O (n * log (n)) im schlimmsten Fall - wahrscheinlich in jedem Fall. – phkahler