Questo è un caso speciale di un algoritmo di selezione che può trovare il ° elemento più piccolo di un array con k è la metà della dimensione dell'array. C'è un'implementazione che è lineare nel caso peggiore.kk
Algoritmo di selezione generico
Per prima cosa vediamo un algoritmo find-kth
che trova il esimo elemento più piccolo di un array: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))
La funzione split(A, pivot)
restituisce in modo L,R
tale che tutti gli elementi in R
siano maggiori di pivot
e L
tutti gli altri (meno un'occorrenza di pivot
). Quindi tutto è fatto in modo ricorsivo.
O(n)O(n2)
Un perno migliore è la mediana di tutte le mediane dei sotto array A
di dimensioni 5, usando la procedura chiamata sull'array di queste mediane.
find-kth(A, k)
B = [median(A[1], .., A[5]), median(A[6], .., A[10]), ..]
pivot = find-kth(B, |B|/2)
...
O(n)
Si noti che la maggior parte delle volte l'utilizzo di un perno casuale è più veloce.