Algorytm sortujący Dual-pivot QuickSort
Należy zauważyć, że używając dwóch pivotów p<q dzielimy tablicę sortowaną na trzy pod-tablice:
- elementy mniejsze od p
- elementy pomiędzy p a q
- elementy większe od q
W takim przypadku liczba porównań pomiędzy kluczami (elementami sortowanymi) jest zmienną losową, a nie deterministyczną funkcją zależną od n (jak to było w zwyczajnym QuickSort
’cie).
Historia QuickSort
’a z dwoma i więcej pivotami:
- 1975: Sedgewick: E(#poroˊwnanˊ)=1532nlnn+O(n) oraz E(#poroˊwnanˊ w Partition)=916n+o(n)
- 2009: Yaroslavsky: E(#poroˊwnanˊ)=1019nlnn+O(n) oraz E(#poroˊwnanˊ w Partition)=1219n+o(n) - algorytm zaimplementowany w Java 7
- 2015: Aumüller i Dietzfelbinger: E(#poroˊwnanˊ)−59nlnn+O(n) oraz E(#poroˊwnanˊ w Partition Count)=23n+o(n). Zaproponowana strategia Count okazuj się również optymalną (w sensie pierwszy składnik wartości oczekiwanej liczby porównań dla Dual-pivot QuickSort nie może być mniejszy niż 59nlnn).
Krótki zarys działania
Najlepiej zaznajomić się ze standardowym (singular-pivot) QuickSort
em przed przeczytaniem poniższej listy działania.
- mamy dwa pivoty p oraz q takie, że p<q
- załóżmy, że w procedurze
partition
klasyfikując ity element tablicy mamy si−1 elementów <p oraz li−1 elementów >q
- jeśli li−1>si−1 to porównuj ity element w pierwszej kolejności z q, a następnie, jeśli jest taka potrzeba, z p
- jeśli li−1<si−1 to porównuj ity element w pierwszej kolejności z p, a następnie jeśli jest taka potrzeba, z q