Lyc´ee Michel Montaigne Math´ematiques-MP1
Quelques algorithmes de tri
Les algorithmes de tri forment l’un des grands sujets d’int´eret de l’algorithmique. Chacun peut se convaincre de la n´ecessit´e de disposer de tels outils (par exemple pour construire un annuaire invers´e). Trier un petit nombre de donn´ees est rapide et simple quelle que soit la strat´egie envisag´ee. Par contre, trier un grand nombre de donn´ees peut ˆetre tr`es couteux en temps ; il est donc important de disposer d’algorithmes efficaces.
L’objectif est de programmer diverses m´ethodes de tri d’un tableau par ordre croissant.
Un tableauaest une suite de N nombres r´eels< ai>.
1`ere m´ethode : tri par s´election
Principe : on cherche le plus petit ´el´ement du tableau, c’est `a dire l’entier m tel queai >am pour tout i. Une fois m trouv´e, on ´echange a1 etam. Puis on recommence avec< a2, . . . , aN >.
Ecrire cet algorithme.
Remarque : son cout estO(N2) op´erations.
2`eme m´ethode : tri `a bulle
Principe : on parcourt la suite a en intervertissant toute paire d’´el´ements cons´ecutifs (aj−1, aj) non or- donn´ees. Apr`es un parcours, l’´el´ement maximum se retrouve en derni`ere position. On recommence alors avec
< a1, . . . , aN−1 >.
Ecrire cet algorithme.
Remarque : son cout estO(N2) op´erations, l´eg`erement moindre que le tri par s´election.
3`eme m´ethode : tri par insertion
Principe : on prend deux ´el´ements qu’on range par ordre croissant. Ensuite, on prend un troisi`eme ´el´ement et on le met `a sa place et on recommence avec un quatri`eme ´el´ement etc...
Ecrire cet algorithme.
Remarque : son cout estO(N2) op´erations, plus efficace que les deux pr´ec´edents.
4`eme m´ethode : tri rapide
L’algorithme dit du ”tri rapide” appartient `a l’ensemble des algorithmes ”diviser pour r´egner”. La cl´e pour le comprendre et de comprendre la phase de partitionnement :
– choisissez un ´el´ement dans la liste `a trier.
– partager la liste `a trier en deux sous-listes : les ´el´ements plus petits que le nombre choisit puis les plus grands.
– `a la fin, on ins`ere le nombre choisit entre ces deux listes.
Une fois le partitionnement op´er´e, on n’a pas encore compl´etement tri´e le tableau. Cette proc´edure s´epare la liste en deux sous-listes plus simples `a trier (car elles ont moins d’´el´ements) que la liste originale. On r´ep`ete alors l’op´eration sur les sous-listes pour obtenir 4 sous-listes plus simples `a trier. Et ainsi de suite jusqu’`a avoir tri´e l’int´egralit´e de la liste.
Par exemple, la proc´edure de partitionnement peut s’´ecrire :
> partition:= proc(l::list) local l1,l2,x,i;
l1:=[];
l2:=[];
x:=l[1];
for i from 2 to nops(l) do if l[i]<x then
l1:=[op(l1),l[i]];
else
l2:=[op(l2),l[i]];
fi;
od;
[l1,[x],l2];
end;
Ecrire `a l’aide de cette proc´edure de partitionnement la proc´edure du tri rapide. On donnera le programme r´ecursivement.