Это особый случай алгоритма выбора, который может найти й наименьший элемент массива с половине размера массива. Существует реализация, которая является линейной в худшем случае.кkk
Общий алгоритм выбора
Сначала давайте рассмотрим алгоритм, find-kth
который находит й наименьший элемент массива: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))
Функция split(A, pivot)
возвращает L,R
таким образом, что все элементы R
больше , чем pivot
и L
все остальные (минус один вхождение pivot
). Тогда все делается рекурсивно.
В среднем это но в худшем случае .O ( n 2 )O(n)O(n2)
Лучшей осью является медиана всех медиан подмассивов 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)
Обратите внимание, что в большинстве случаев использование случайного поворота происходит быстрее.