Wymiar pedagogiczny
Ze względu na swoją prostotę metoda partycjonowania Lomuto może być łatwiejsza do wdrożenia. Jest ładna anegdota w Perle programowania Jona Bentleya na temat sortowania:
„Większość dyskusji na temat Quicksort wykorzystuje schemat partycjonowania oparty na dwóch zbliżających się indeksach [...] [tj. Hoare'a]. Chociaż podstawowa idea tego schematu jest prosta, zawsze uważałem szczegóły za trudne - kiedyś spędziłem większą część dwóch dni, ścigając błąd ukryty w krótkiej pętli partycjonowania. Czytelnik wstępnego szkicu skarżył się, że standardowa metoda z dwoma indeksami jest w rzeczywistości prostsza niż metoda Lomuto, i naszkicował trochę kodu, aby o tym powiedzieć; Przestałem się zajmować, gdy znalazłem dwa błędy. ”
Wymiar wydajności
Dla praktycznego zastosowania łatwość wdrożenia może być poświęcona ze względu na wydajność. Na podstawie teoretycznej możemy określić liczbę porównań elementów i zamian w celu porównania wydajności. Ponadto na rzeczywisty czas działania będą mieć wpływ inne czynniki, takie jak wydajność buforowania i nieprzewidywalne oddziały.
Jak pokazano poniżej, algorytmy zachowują się bardzo podobnie w przypadkowych kombinacjach, z wyjątkiem liczby zamian . Tam Lomuto potrzebuje trzy razy tyle co Hoare!
Liczba porównań
n−1n
Liczba zamian
Liczba zamian jest losowa dla obu algorytmów, w zależności od elementów w tablicy. Jeśli założymy przypadkowe permutacje , tj. Wszystkie elementy są różne i każda permutacja elementów jest jednakowo prawdopodobna, możemy przeanalizować oczekiwaną liczbę zamian.
1,…,n
Metoda Lomuto
jA[j]x1,…,nx−1xx−1x
{1,…,n}1n
1n∑x=1n(x−1)=n2−12.
n
Metoda Hoare'a
x
ijxij
x
Hyp(n−1,n−x,x−1)n−xx−1(n−x)(x−1)/(n−1)x
Na koniec uśredniamy ponownie wszystkie wartości przestawne, aby uzyskać ogólną oczekiwaną liczbę zamian partycjonowania Hoare:
1n∑x=1n(n−x)(x−1)n−1=n6−13.
(Bardziej szczegółowy opis można znaleźć w mojej pracy magisterskiej , strona 29.)
Wzorzec dostępu do pamięci
Oba algorytmy używają dwóch wskaźników do tablicy, które skanują ją sekwencyjnie . Dlatego oba zachowują się prawie optymalnie w buforowaniu wrt.
Równe elementy i już posortowane listy
Jak już wspomniano w Wandering Logic, wydajność algorytmów różni się bardziej drastycznie w przypadku list, które nie są przypadkowymi kombinacjami.
n/2
0ijO(nlogn)
0A[j] <= x
i=nΘ(n2)
Wniosek
Metoda Lomuto jest prosta i łatwiejsza do wdrożenia, ale nie powinna być stosowana do implementacji metody sortowania bibliotek.
A[i+1] <= x
. W posortowanej tablicy (i przy rozsądnie wybranych osiach) Hoare prawie nie zamienia się, a Lomuto robi tonę (gdy j staje się wystarczająco mały, to wszystkoA[j] <= x
.) Czego mi brakuje?