Vous êtes sur la page 1sur 8

Le tri par slection

Par K-Phoen

www.siteduzero.com

Dernire mise jour le 1/02/2010

Sommaire

1/7

Sommaire
Sommaire ........................................................................................................................................... 1 Informations sur le tutoriel ................................................................................................................... 0 Le tri par slection ............................................................................................................................... 2
Informations sur le tutoriel ................................................................................................................................................. 2 Principe .............................................................................................................................................................................. 2 Implmentations ................................................................................................................................................................ 3
Implmentation du tri d'un tableau .............................................................................................................................................................................. 3 Implmentation du tri d'une liste .................................................................................................................................................................................. 6

Complexit ......................................................................................................................................................................... 6
Calcul (grossier) de la complexit ............................................................................................................................................................................... 6

www.siteduzero.com

Le tri par slection

2/7

Le tri par slection


Parmi les nombreux algorithmes de tri existants, celui dont je vais vous parler aujourd'hui a l'avantage d'tre un des plus faciles mettre en uvre. Mme si je l'implmenterai ici avec une liste d'entiers, il fonctionne parfaitement avec n'importe quelle entit que l'on peut comparer (caractres, flottants, structures, etc...). Sommaire du tutoriel :

Informations sur le tutoriel


Auteur : K-Phoen Difficult : Licence :

Principe Implmentations Complexit

Principe
L'ide est simple : rechercher le plus grand lment (ou le plus petit), le placer en fin de tableau (ou en dbut), recommencer avec le second plus grand (ou le second plus petit), le placer en avant-dernire position (ou en seconde position) et ainsi de suite jusqu' avoir parcouru la totalit du tableau. Pour la suite du tuto ainsi que pour les diffrentes implmentations que je donnerai, j'appliquerai l'algorithme en recherchant l'lment le plus grand du tableau, et non le plus petit.

Cette dcision est importante car chaque fois que je dplacerai un lment en fin de tableau, je serai certain qu'il n'aura plus tre dplac jusqu' la fin du tri. Regardons ensemble ce que donne l'algorithme appliqu un exemple : 1. Soit le tableau d'entiers suivant : 6 2 8 1 5 3 7 9 4 0 2. L'lment le plus grand se trouve en 7me position (si on commence compter partir de zro) : 6 2 8 1 5 3 7 9 4 0 3. On change l'lment le plus grand (en 7me position) avec le dernier : 6 2 8 1 5 3 7 0 4 9 4. Le dernier lment du tableau est dsormais forcment le plus grand. On continue donc en considrant le mme tableau, en ignorant son dernier lment : 6 2 8 1 5 3 7 0 4 9 Toute l'astuce de l'algorithme est l : on ignore volontairement dans la suite du traitement les lments que l'on a dplacs la fin du tableau. 5. De mme, on repre l'lment le plus grand en ignorant le dernier et on l'change avec l'avant dernier : 6 2 4 1 5 3 7 0 8 9 6. Et ainsi de suite, en ignorant chaque fois les lments dj tris (en gras). 6 2 4 1 5 3 0 7 8 9 7.

www.siteduzero.com

Le tri par slection


0 2 4 1 5 3 6 7 8 9 8. 0 2 4 1 3 5 6 7 8 9 9. 0 2 3 1 4 5 6 7 8 9 10. 0 2 1 3 4 5 6 7 8 9 11. 0 1 2 3 4 5 6 7 8 9 12. 0 1 2 3 4 5 6 7 8 9 13. Et on a enfin tri notre tableau ! On sait que notre tableau est tri lorsque le nombre d'lments non tris est gal 1.

3/7

Implmentations Implmentation du tri d'un tableau


Maintenant que vous connaissez l'algorithme et que vous avez vu sur un exemple son fonctionnement, nous pouvons passer son implmentation ! Mais avant cela, on remarque qu'il est possible de dcomposer l'algorithme en plusieurs sous-fonctions , ce qui facilitera notre travail : La recherche de l'lment le plus grand ; L'change de deux lments ; La ralisation du tri.

La fonction max()
Le fonctionnement de cette fonction (qui prend en paramtre un tableau et sa taille pour renvoyer l'indice de l'lment le plus grand) est simple : on se contente de parcourir l'intgralit du tableau pour chaque fois comparer l'lment actuel avec le maximum provisoire. J'ai choisi de ne conserver que l'indice du maximum provisoire, que je dfinis par dfaut comme tant celui de la premire valeur du tableau. Le choix de cette valeur de dpart est important ! En effet, si vous dfinissez directement une valeur telle que 0 et que votre tableau est du type {-6, -3, -2, -18}, votre algorithme renverra un maximum erron ! Code : C /** * Renvoie l'indice du plus grand lment du tableau *

www.siteduzero.com

Le tri par slection


* int tab[] :: tableau dans lequel on effectue la recherche * int taille :: taille du tableau * * return int l'indice du plus grand lment **/ int max(int tab[], int taille) { // on considre que le plus grand lment est le premier int i=0, indice_max=0; while(i < taille) { if(tab[i] > tab[indice_max]) indice_max = i; i++; } } return indice_max;

4/7

La fonction echanger()
Le but ici est d'changer deux lments (dont on connait les indices) d'un tableau. On agit de la mme manire que lorsqu'on souhaite changer le contenu de deux verres d'eau : on prend un troisime verre pour stocker temporairement un des contenus changer (l'image peut paraitre futile ou purile, mais c'est exactement le comportement que reproduit cette petite fonction ). Code : C /** * change deux lments d'un tableau * * int tab[] :: tableau dans lequel on effectue l'change * int x :: indice du premier lment * int y :: indice du second lment * * return void **/ void echanger(int tab[], int x, int y) { int tmp; tmp = tab[x]; tab[x] = tab[y]; tab[y] = tmp;

La fonction tri_selection()
Petit exo du jour, bonjour ! (Eh oui, je ne vais quand mme pas tout faire ... si ?) Aujourd'hui et de manire totalement inopine, je vais vous demander d'implmenter un algorithme qui vous est totalement inconnu ! Il est le suivant : Tant que la taille du tableau est suprieure 0 : Rechercher l'indice de l'lment le plus grand ; changer cet lment avec le dernier du tableau ; Dcrmenter la taille. Car oui, implmenter l'algorithme de tri par slection n'est pas plus compliqu que cela. La preuve, mme vous, zros, allez y

www.siteduzero.com

Le tri par slection


parvenir ! Secret (cliquez pour afficher) Code : C /** * Trie le tableau donn selon l'algorithme de tri par slection * * int tab[] :: tableau trier * int taille :: taille du tableau * * return void **/ void tri_selection(int tab[], int taille) { int indice_max; // chaque tour de boucle, on va dplacer le plus grand lment // vers la fin du tableau, on diminue donc chaque fois sa taille // car le dernier lment est obligatoirement correctement // plac (et n'a donc plus besoin d'tre parcouru/dplac) for(; taille > 1 ; taille--) // tant qu'il reste des lments non tris { indice_max = max(tab, taille); echanger(tab, taille-1, indice_max); // on change le dernier lment avec le plus grand } }

5/7

J'ai aussi cod une version rcursive de ce tri (qui me parrait plus "naturelle", mais ne diffre en rien ou presque de la version itrative) : Secret (cliquez pour afficher) Code : C /** * Trie le tableau donn selon l'algorithme de tri par slection * * VERSION RCURSIVE * * int tab[] :: tableau trier * int taille :: taille du tableau * * return void **/ void tri_selection_recursif(int tab[], int taille) { // un tableau d'un seul lment ou moins n'a pas besoin d'tre tri if(taille <= 1) return; echanger(tab, taille-1, max(tab, taille)); // on change le dernier lment avec le plus grand // on rappelle la fonction en diminuant la taille du tableau // on peut faire cela car on est certain que le dernier lment

www.siteduzero.com

Le tri par slection


// est le plus grand (donc plus besoin de le dplacer) return tri_selection_recursif(tab, taille-1);

6/7

Vous noterez que dans les deux versions du tri (rcursive ou pas), aucune optimisation n'a t apporte. Je ne vrifie par exemple pas si j'ai effectivement besoin de raliser l'change (si max(...) == taille-1, pas besoin d'changer quoi que ce soit) ... je laisse cela votre charge ! =) Pour vous entrainer, essayez de coder le tri par slection en recherchant non plus l'lment le plus grand, mais l'lment le plus petit !

Implmentation du tri d'une liste


Eh oui, bien que je vous parle depuis le dbut du tutoriel du cas particulier des tableaux, il faut aussi savoir cet algorithme fonctionne parfaitement sur d'autres structures de donnes, dont les listes ! Cependant, bluestorm ayant dj trait cette partie du sujet dans son tutoriel sur l'algorithmique, je me contenterai de vous rediriger vers ce dernier (deux implmentations sont proposes : une en OCaml et l'autre en C).

Complexit
Vous l'aurez remarqu, le tri par slection, l'oppos du tri bulles, effectue beaucoup de comparaisons de deux lments et relativement peu d'changes. On privilgie donc cette mthode lorsque la comparaison est peu coteuse en ressources mais que l'change ne l'est pas.

Calcul (grossier) de la complexit


Minute minute ! La complexit, qu'est-ce que c'est ? Si vous vous posez cette question, je vous invite lire le tutoriel de bluestorm sur l'Algorithmique pour l'apprenti programmeur, et plus prcisment la partie sur la notion de complexit. De mme, si vous n'tes pas trs l'aise avec cette notion ou que les formules mathmatiques vous donnent des boutons, je vous recommande de lire son paragraphe sur la complexit du tri par slection !

Tentons de raisonner ... la premire itration, on effectue comparaisons. la me itration, on effectue donc comparaisons (puisque chaque itration on dcrmente la taille du tableau). Le nombre total de comparaisons pour trier un tableau de taille est donc la somme de pour allant de 1 en langage mathmatique :

, soit

On s'aperoit donc que la complexit (en comparaisons) de notre algorithme est quadratique (en

), ce qui n'est pas trs

bon. Pour faire simple et tre plus concret, titre d'exemple, si vous doublez la taille d'un tableau, il vous faudra quatre fois plus de temps pour le trier. En effet, la simplicit de cet algorithme fait qu'on le qualifie d'algorithme naf . Cela ne veut pas pour autant dire qu'il est incorrect, il est juste trop simpliste pour tre rellement efficace (jetez un il du ct de l'algorithme de tri rapide, ou quicksort, vous verrez que ce n'est pas la mme simplicit d'implmentation ).

www.siteduzero.com

Le tri par slection

7/7

En rsum, lorsque on utilise le tri par slection : On effectue environ comparaisons ;

On effectue environ changes ; La complexit moyenne et dans le pire des cas est quadratique.

www.siteduzero.com