Für mich macht es Sinn, dass die Lösung eines Problems dadurch schneller vonstatten geht, wenn die beiden Hälften weniger als die Hälfte der Arbeit für die Bearbeitung des gesamten Datensatzes in Anspruch nehmen.
Das ist nicht die Essenz von Divide-and-Conquer-Algorithmen. Normalerweise ist der Punkt, dass die Algorithmen überhaupt nicht "mit dem gesamten Datensatz umgehen" können. Stattdessen wird es in Teile unterteilt, die trivial zu lösen sind (wie das Sortieren von zwei Zahlen), dann werden diese trivial gelöst und die Ergebnisse so rekombiniert, dass sich eine Lösung für den gesamten Datensatz ergibt.
Aber warum nicht den Datensatz in drei Teile aufteilen? Vier? n?
Hauptsächlich, weil das Aufteilen in mehr als zwei Teile und das erneute Kombinieren von mehr als zwei Ergebnissen zu einer komplexeren Implementierung führt, die grundlegende (Big O) -Charakteristik des Algorithmus jedoch nicht ändert - der Unterschied ist ein konstanter Faktor und kann zu einer Verlangsamung führen wenn die Aufteilung und Rekombination von mehr als 2 Teilmengen zusätzlichen Overhead erzeugt.
Wenn Sie beispielsweise eine 3-Wege-Zusammenführungssortierung durchführen, müssen Sie in der Rekombinationsphase für jedes Element das größte von 3 Elementen ermitteln. Dies erfordert 2 Vergleiche anstelle von 1, sodass Sie insgesamt doppelt so viele Vergleiche durchführen . Im Gegenzug reduzieren Sie die Rekursionstiefe um den Faktor ln (2) / ln (3) == 0,63, sodass Sie 37% weniger Swaps haben, aber 2 * 0,63 == 26% mehr Vergleiche (und Speicherzugriffe). Ob das gut oder schlecht ist, hängt davon ab, welche Hardware teurer ist.
Ich habe auch viele Hinweise auf 3-Wege-Quicksort gesehen. Wann ist das schneller?
Anscheinend erfordert eine Dual-Pivot-Variante von Quicksort nachweislich die gleiche Anzahl von Vergleichen, aber im Durchschnitt 20% weniger Swaps, was einen Nettogewinn bedeutet.
Was wird in der Praxis angewendet?
Heutzutage programmiert kaum jemand mehr seine eigenen Sortieralgorithmen. Sie verwenden eine, die von einer Bibliothek bereitgestellt wird. Beispielsweise verwendet die Java 7-API tatsächlich die Dual-Pivot-QuickSort-Funktion.
Leute, die aus irgendeinem Grund tatsächlich ihren eigenen Sortieralgorithmus programmieren, werden sich eher an die einfache 2-Wege-Variante halten, da weniger Fehlerpotential die meiste Zeit 20% bessere Leistung übertrifft. Denken Sie daran: Die mit Abstand wichtigste Leistungsverbesserung ist, wenn der Code von "nicht funktioniert" zu "funktioniert" wechselt.