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-kth
qui 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,R
telle que tous les éléments dedans R
sont plus grands que pivot
et L
tous 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 A
de 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.