Pädagogische Dimension
Aufgrund seiner Einfachheit ist die Partitionierungsmethode von Lomuto möglicherweise einfacher zu implementieren. Es gibt eine nette Anekdote in Jon Bentleys Programmierperle über das Sortieren:
„Die meisten Diskussionen über Quicksort verwenden ein Partitionierungsschema, das auf zwei sich nähernden Indizes basiert [...] [dh Hoares]. Obwohl die Grundidee dieses Schemas einfach ist, habe ich die Details immer als schwierig empfunden - ich habe einmal den größten Teil von zwei Tagen damit verbracht, einen Fehler in einer kurzen Partitionierungsschleife aufzuspüren. Ein Leser eines Vorentwurfs beklagte sich darüber, dass die Standardmethode mit zwei Indizes tatsächlich einfacher als die von Lomuto sei, und skizzierte einen Code, um dies zu verdeutlichen. Ich habe aufgehört zu suchen, nachdem ich zwei Bugs gefunden habe. “
Leistungsdimension
Für den praktischen Gebrauch kann die einfache Implementierung aus Gründen der Effizienz geopfert werden. Auf theoretischer Basis können wir die Anzahl der Elementvergleiche und Swaps bestimmen, um die Leistung zu vergleichen. Darüber hinaus wird die tatsächliche Laufzeit von anderen Faktoren beeinflusst, wie z. B. der Caching-Leistung und falschen Vorhersagen für Zweige.
Wie unten gezeigt, verhalten sich die Algorithmen bei zufälligen Permutationen mit Ausnahme der Anzahl der Swaps sehr ähnlich . Dort braucht Lomuto dreimal so viele wie Hoare!
Anzahl der Vergleiche
n−1n
Anzahl der Swaps
Die Anzahl der Auslagerungen ist für beide Algorithmen abhängig von den Elementen im Array zufällig. Wenn wir zufällige Permutationen annehmen , dh alle Elemente sind unterschiedlich und jede Permutation der Elemente ist gleich wahrscheinlich, können wir die erwartete Anzahl von Swaps analysieren .
1,…,n
Lomutos Methode
jA[j]x1,…,nx−1xx−1x
{1,…,n}1n
1n∑x=1n(x−1)=n2−12.
n
Hoares Methode
X
ichjXichj
x
Hyp(n−1,n−x,x−1)n−xx−1(n−x)(x−1)/(n−1)x
Abschließend werden alle Pivot-Werte erneut gemittelt, um die insgesamt erwartete Anzahl von Swaps für die Hoare-Partitionierung zu erhalten:
1n∑x=1n(n−x)(x−1)n−1=n6−13.
(Eine genauere Beschreibung finden Sie in meiner Masterarbeit , Seite 29.)
Speicherzugriffsmuster
Beide Algorithmen verwenden zwei Zeiger in das Array, die es nacheinander abtasten . Daher verhalten sich beide nahezu optimal bezüglich Caching.
Gleiche Elemente und bereits sortierte Listen
Wie bereits von Wandering Logic erwähnt, unterscheidet sich die Leistung der Algorithmen bei Listen, die keine zufälligen Permutationen sind, drastischer.
n/2
0ijO(nlogn)
0A[j] <= x
i=nΘ(n2)
Fazit
Die Methode von Lomuto ist einfach und einfacher zu implementieren, sollte jedoch nicht für die Implementierung einer Bibliotheksortierungsmethode verwendet werden.
A[i+1] <= x
. In einem sortierten Array (und bei vernünftigerweise gewählten Pivots) macht Hoare fast keine Swaps und Lomuto macht eine Tonne (sobald j klein genug ist, dann alleA[j] <= x
.) Was vermisse ich?