Dies ist ein Sonderfall eines Auswahlalgorithmus , der das kleinste Element eines Arrays finden kann, wobei k die Hälfte der Größe des Arrays ist. Es gibt eine Implementierung, die im schlimmsten Fall linear ist.kk
Generischer Auswahlalgorithmus
Schauen wir uns zuerst einen Algorithmus an find-kth
, der das -kleinste Element eines Arrays findet:k
find-kth(A, k)
pivot = random element of A
(L, R) = split(A, pivot)
if k = |L|+1, return pivot
if k ≤ |L| , return find-kth(L, k)
if k > |L|+1, return find-kth(R, k-(|L|+1))
Die Funktion split(A, pivot)
gibt L,R
so zurück, dass alle Elemente in R
größer sind als pivot
und L
alle anderen (minus eines Vorkommens von pivot
). Dann wird alles rekursiv gemacht.
Dies ist im Durchschnitt , aber O ( n 2 ) im ungünstigsten Fall.O ( n )O ( n2)
Ein besserer Pivot ist der Median aller Mediane von Subarrays der A
Größe 5, indem die Prozedur für das Array dieser Mediane aufgerufen wird.
find-kth(A, k)
B = [median(A[1], .., A[5]), median(A[6], .., A[10]), ..]
pivot = find-kth(B, |B|/2)
...
Dies garantiert in allen Fällen . Es ist nicht so offensichtlich. Diese Powerpoint-Folien sind hilfreich, um sowohl den Algorithmus als auch die Komplexität zu erklären.O ( n )
Beachten Sie, dass die meiste Zeit mit einem zufälligen Pivot schneller ist.