C'est un cas particulier d'un algorithme de sélection qui peut trouver le ème élément le plus petit d'un tableau, k étant la moitié de la taille du tableau. Il existe une implémentation linéaire dans le pire des cas.kk
Algorithme de sélection générique
Voyons tout d'abord un algorithme find-kthqui trouve le ème élément le plus petit d'un tableau: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 fonction split(A, pivot)renvoie L,Rtelle que tous les éléments dedans Rsont plus grands que pivotet Ltous les autres (moins une occurrence de pivot). Ensuite, tout est fait récursivement.
C'est en moyenne mais O ( n 2 ) dans le pire des cas.O ( n )O ( n2)
Un meilleur pivot est la médiane de toutes les médianes des sous-réseaux Ade taille 5, en appelant la procédure sur le tableau de ces médianes.
find-kth(A, k)
B = [median(A[1], .., A[5]), median(A[6], .., A[10]), ..]
pivot = find-kth(B, |B|/2)
...
Ceci garantit dans tous les cas. Ce n'est pas si évident. Ces diapositives PowerPoint sont utiles pour expliquer l’algorithme et la complexité.O ( n )
Notez que la plupart du temps, l'utilisation d'un pivot aléatoire est plus rapide.