Comme j'ai eu un peu de mal à trouver des informations sur la recherche rapide de médiane, je récapitule ici ce que j'ai trouvé.
Soit n valeurs
Soit Tab le tableau contenant ces valeurs.
Trivial :
Trier les valeurs et prendre la valeur du milieu
Plus efficace :
Sélectionner la n/2 ieme valeur la plus petite grace à un quickselect
Sur un faible nombre de valeurs (et c'est le cas qui m'interesse ici, notamment en traitement d'image) la solution la plus rapide :
Soit la fonction trier :
Si on peut modifier les valeurs d'entrées :
Trier(a,b) inverse a et b si a > b
Si on ne peut pas modifier les valeurs d'entrées :
Il faudra soit tout copier dans un tableau temporaire pour travailler dessus, soit pour gagner un peu de temps, copier tout en triant selon l'étape dans laquelle on est.
Exemple pour 3 valeurs :
Pour 5 valeurs
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 trier(Tab[0],Tab[1]); trier(Tab[1],Tab[2]); trier(Tab[0],Tab[1]); retourner Tab[1];
Pour 9 valeurs
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 trier(Tab[0],Tab[1]); trier(Tab[3],Tab[4]); trier(Tab[0],Tab[3]); trier(Tab[1],Tab[4]); trier(Tab[1],Tab[2]); trier(Tab[2],Tab[3]); trier(Tab[1],Tab[2]); retourner Tab[2];
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 trier(Tab[1],Tab[2]); trier(Tab[4],Tab[5]); trier(Tab[7],Tab[8]); trier(Tab[0],Tab[1]); trier(Tab[3],Tab[4]); trier(Tab[6],Tab[7]); trier(Tab[1],Tab[2]); trier(Tab[4],Tab[5]); trier(Tab[7],Tab[8]); trier(Tab[0],Tab[3]); trier(Tab[5],Tab[8]); trier(Tab[4],Tab[7]); trier(Tab[3],Tab[6]); trier(Tab[1],Tab[4]); trier(Tab[2],Tab[5]); trier(Tab[4],Tab[7]); trier(Tab[4],Tab[2]); trier(Tab[6],Tab[4]); trier(Tab[4],Tab[2]); retourner Tab[4];
Partager