Professional Documents
Culture Documents
Par K-Phoen
www.siteduzero.com
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
2/7
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
3/7
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
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
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
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 !
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.
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
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
7/7
On effectue environ changes ; La complexit moyenne et dans le pire des cas est quadratique.
www.siteduzero.com