Este é um caso especial de um algoritmo de seleção que pode encontrar o menor elemento de uma matriz com k é a metade do tamanho da matriz. Existe uma implementação que é linear no pior dos casos.kk
Algoritmo de seleção genérico
Primeiro vamos ver um algoritmo find-kth
que encontra o menor elemento de uma matriz: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))
A função split(A, pivot)
retorna de L,R
forma que todos os elementos em R
sejam maiores que pivot
e L
todos os outros (menos uma ocorrência de pivot
). Então tudo é feito recursivamente.
O(n)O(n2)
Um pivô melhor é a mediana de todas as medianas de sub-matrizes A
de tamanho 5, usando a chamada do procedimento na matriz dessas medianas.
find-kth(A, k)
B = [median(A[1], .., A[5]), median(A[6], .., A[10]), ..]
pivot = find-kth(B, |B|/2)
...
O(n)
Observe que na maioria das vezes o uso de um pivô aleatório é mais rápido.