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-kthque 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,Rforma que todos os elementos em Rsejam maiores que pivote Ltodos 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 Ade 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.