Vous êtes sur la page 1sur 3

Méthodes de tri

2002
c – Florence HENRY – Université de Versailles
florence.henry@obspm.fr

1 Présentation des différentes méthodes de tri


Le but du jeu est de trier un tableau tab de N entiers de telle sorte que
tab[0] < tab[1] < · · · < tab[N − 1]

1.1 Tri par sélection


1. Trouver l’emplacement du plus petit élément du tableau, c’est-à-dire l’entier m tel que
tab[m] ≤ tab[i], ∀i ∈ [0, N − 1]

8 54 7 23 1 14

m
2. Une fois cet emplacement trouvé, on échange les éléments tab[m] et tab[0]. Maintenant, tab[0] contient
le plus petit élément le plus petit du tableau, et on n’y touche plus (chiffre entouré dans l’exemple).

1
, 54 7 23 8 14
3. Recommencer les opérations 1 et 2 sur les éléments [1, N − 1] du tableau. Ainsi, on recherche le plus petit
élément parmi (tab[1], · · · ,tab[N − 1]) et on l’échange avec tab[1]. tab[1] contient alors le 2ème plus petit
élément du tableau.

1
, 54 7 23 8 14

m
1
, 7
, 54 23 8 14
4. Et ainsi de suite jusqu’à la fin du tableau .

1
, 7
, 8
, 14
, 23
, 54
,
Il est facile de compter le nombre d’opérations nécessaires. À chaque itération i, on démarre à l’élément
tab[i] et on le compare successivement à tab[i + 1], tab[i + 2], ..., tab[n]. On fait donc N − i comparaisons.
On commence à i = 1 et on finit à i = N − 1. On fait donc (N + 1) + (N − 2) + · · · + 2 + 1 = N(N−1) 2
comparaisons, et N − 1 échanges. Le tri par sélection fait donc de l’ordre de N 2 comparaisons.
On écrira que le tri par sélection est en O (N 2 ). Le temps nécessaire pour trier est quadratique par rapport
aux nombres d’éléments du tableau.

1.2 Tri à bulle


1. On parcourt la suite (tab[0],tab[2], · · · ,tab[N − 2]) en intervertissant toute paire déléments consécutifs
(tab[i],tab[i + 1]) non ordonnés. Ainsi, après un parcours, l’élément maximum du tableau tab se retourve
en tab[N − 1].

8 54 7 23 1 14 tableau initial
8 54 7 23 1 14 8 < 54 ⇒ on ne change rien
8 7 54 23 1 14 54 > 7 ⇒ on permute 54 et 7
8 7 23 54 1 14 54 > 23 ⇒ on permute 54 et 23
8 7 23 1 54 14 1 < 54 ⇒ on permute 54 et 1
8 7 23 1 14 54
, 14 < 54 ⇒ on permute 54 et 14

1
2. On recommence avec la suite (tab[0],tab[2], · · · ,tab[N − 3]) et le 2ème plus grand élément se retrouve
en tab[N − 2]

8 7 23 1 14 54
, tableau à la fin de l’étape 1.
8 7 1 14 23
, 54
, tableau à la fin de l’étape 2.

3. Et ainsi de suite jusqu’à ce que la suite à parcourir soit (tab[0]).Le tableau est alors trié.

1
, 7
, 8
, 14
, 23
, 54
, tableau final

On peut aussi compter le nombre d’opérations à réaliser. Il s’agit également d’un tri en O (N 2 ) comparaisons.

1.3 Tri par insertion


C’est la méthode utilisée pour trier un paquet de cartes.
1. On prend les 2 premières cartes et on les met dans l’ordre si nécessaire.

8 54 7 23 1 14 8 < 54 ⇒ on ne change rien

2. On prend la 3ème carte et on la met à sa place dans les 2 premières, ...


i

8 54 7 23 1 14 7 < 8 ⇒ on insère 7 devant 8
7 8 54 23 1 14

3. De manière générale on suppose les i − 1 premières cartes triées. On prend la ième carte, et on essaie de
la mettre à sa place dans les cartes déjà triées.
i

7 8 54 23 1 14 8 < 23 < 54 ⇒ on nsère 23 entre 8 et 54
7 8 23 54 1 14

4. Et on continue jusqu’à i = N.
i

7 8 23 54 1 14 1 < 7 ⇒ on insère 1 devant 7
1 7 8 23 54 14
i

1 7 8 23 54 14 8 < 14 < 23 ⇒ on insère 14 entre 8 et 23
1 7 8 14 23 54

Le nombre de comparaisons ici est aussi en O (N 2 ). Mais à la différence des autres tris, le nombre d’échanges
à faire décroit fortement si le tableau initial est presque en ordre.

2 Travail demandé
Votre programme devra permettre de trier un tableau de réels par les 3 méthodes. Pendant l’exécution du
programme, l’utilisateur choisira la taille du tableau et la méthode de tri.
L’usage des fonctions sera essentiel : pour chaque méthode, pour l’inversion de 2 élements, pour l’insertion
d’un élément dans un tableau ...
Le remplissage du tableau se fera comme vous le voulez : par l’utilisateur, par lecture dans un fichier, ou
aléatoirement.
L’aspect convivial du programme (choix mutliples et répétitifs proposés à l’utilisateur) ainsi que l’aspect
modulaire (utilisation des fonctions au maximum) seront appréciés pour l’évaluation.
Vous ferez enfin un compte-rendu qui contiendra le listing de votre programme, et les réflexions (informa-
tiques, mathématiques, ...) que vous a inspiré le projet ainsi que les difficultés que vous avez rencontré.

2
3 Pour aller plus loin
Vous pourrez, en plus, créer un tableau de très grande dimension (N=50, 100, 500, 1000, 10000, ...), le
remplir de manière aléatoire (grâce à la fonction random) et comparer ainsi les différentes méthodes de tri en
les chronométrant.
On chronomètre la durée d’un programme projet en l’exécutant avec la commande
time ./projet
au lieu du
./projet
habituel.

4 Générateur de nombres aléatoires


Dans un programme, on génère des nombres aléatoires grâce à la commande random(). Voici la marche à
suivre :
1. mettre un #include<stdlib.h> pour pouvoir utiliser cette fonction.
2. appeler la fontion srandom(1) une fois, au début du programme (cette fonction initialise le générateur
de nombres aléatoires)
Voici un programme qui génère 10 entiers entre 0 et 256 :
# include < stdio .h>
# include < stdlib .h>
# define INT_MAX ~(1<<31)-1

main (){
long a;
int i;

srandom (1);

for ( i =1 ; i < 1000 ; i ++){


a = ( double ) random () * 256 / INT_MAX ;
printf ("% ld \n ", a );
}

Vous aimerez peut-être aussi