Це особливий випадок алгоритму вибору, який може знайти й найменший елемент масиву з k - половину розміру масиву. Існує реалізація, лінійна в гіршому випадку.кк
Загальний алгоритм відбору
Спочатку давайте подивимось алгоритм, find-kth
який знаходить й найменший елемент масиву:к
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))
Функція split(A, pivot)
повертає L,R
таким чином, що всі елементи R
більше , ніж pivot
та L
всі інші (мінус один входження pivot
). Потім все робиться рекурсивно.
Це в середньому , але O ( п 2 ) в гіршому випадку.O ( n )О ( н.)2)
Кращим стрижнем є медіана всіх медіанів підмасивів A
розміром 5, використовуючи виклик процедури на масив цих медіанів.
find-kth(A, k)
B = [median(A[1], .., A[5]), median(A[6], .., A[10]), ..]
pivot = find-kth(B, |B|/2)
...
Це гарантує у всіх випадках. Це не так очевидно. Ці слайди Powerpoint корисні як для пояснення алгоритму, так і для складності.O ( n )
Зауважте, що більшість часу за допомогою випадкового стрижня відбувається швидше.