Jest to szczególny przypadek algorytmu selekcji, który może znaleźć ty najmniejszy element tablicy za pomocą kkk czyli połowę wielkości tablicy. W najgorszym przypadku istnieje implementacja liniowa.
Ogólny algorytm selekcji
Najpierw zobaczmy algorytm, find-kth
który znajduje ty najmniejszy element tablicy: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))
Funkcja split(A, pivot)
zwraca L,R
tak, że wszystkie elementy R
są większe niż pivot
i L
wszystkie inne (minus jedno wystąpieniepivot
). Następnie wszystko odbywa się rekurencyjnie.
Jest to w średniej, ale O ( N 2 ), w najgorszym przypadku.O ( n )O ( n2))
Lepszym punktem obrotu jest mediana wszystkich median podtablic o A
rozmiarze 5, poprzez wywołanie procedury na tablicy tych median.
find-kth(A, k)
B = [median(A[1], .., A[5]), median(A[6], .., A[10]), ..]
pivot = find-kth(B, |B|/2)
...
To gwarantuje we wszystkich przypadkach. To nie jest takie oczywiste. Te slajdy PowerPoint są pomocne zarówno w wyjaśnieniu algorytmu, jak i złożoności.O ( n )
Zauważ, że przez większość czasu korzystanie z losowego obrotu jest szybsze.