PSD 1ère MI 2015/2016 Chapitre 2 Les algorithmes de tri et de recherche I. Introduction Parmi les plus grands avantages de l’ordinateur c’est qu’il permet de stocker de grandes quantités d’informations (en MC et en MS). On a souvent besoins de chercher certaines informations pour une consultation ou une mise à jour ; Cette recherche doit être rapide les informations doivent être ordonnées nécessité d’ordonner les informations en MC ou MS avant la recherche notion de tri. II. Tri d’un tableau Soit un tableau de N éléments, on veut chercher une valeur Val dans ce tableau ; Trouve faux I 1 ; TQ (I<=N) et (non trouve) faire Si val = T[I] alors Trouve vrai ; Indice I ; Finsi I=i+1 ; finTQ On est obligé de parcourir le tableau élément par élément jusqu’à trouver ou arriver à la fin, c’est comme si on cherche un mot dans un dictionnaire non ordonné. Mais si le tableau étai trié, on aurait un meilleur algorithme de recherche temps d’exécution raisonnable. II.1. La méthode de tri par sélection Données : tableau T de taille N, Résultats : le même tableau T ordonné dans l’ordre croissant. L’algorithme de tri associé au tri par sélection consiste à : - Trouver l’emplacement du plus petit élément dans T. Echanger l’élément trouvé avec le premier élément du tableau (i=1). Recommencer l’opération pour le reste du tableau (i.e. i = [2, N [. Exemple : nous voulons trier le tableau [20, 6, 8, 1, 5] Nous allons passer sur les étapes suivantes : [1, 6, 8, 20, 5] ; [1, 5, 8, 20, 6] ; [1, 5, 6, 20, 8] ; [1, 5, 6, 8, 20] 19 PSD 1ère MI 2015/2016 Chapitre 2 Les algorithmes de tri et de recherche Algorithme Pour i allant de 1 à N-1 faire M i ; Pour j allant de i+1 à N faire Si t[j]< t[m] alors M j ; Finsi Fin pour A t[i] ; T[i] T[m] ; T[m] A ; Finpour II.2. la méthode de tri à bulles Le tri à bulles est une variante du tri par sélection. Son principe consiste à échanger deux éléments consécutifs qui ne sont pas ordonnés d’un tableau donné. Après ce parcours l’élément le plus grand va se retrouver en dernier. Nous recommençons l’opération tant que le tableau n’est pas trié. Exemple : prenant le tableau de l’exemple précédent Avant trie : [20, 6, 8, 1, 5] Première itération [6, 20, 8, 1, 5] ; [6, 8, 20, 1, 5] ; [6, 8, 1, 20, 5] ; [6, 8, 1, 5, 20] Deuxième itération [6, 1, 8, 5, 20] ; [6, 1, 5, 8, 20] Troisième itération [1, 6, 5, 8, 20] ; [1, 5, 6, 8, 20] Quatrième itération tableau trié ; aucun échange Algorithme Trie faux ; TQ non trie faire Trie vrai ; Pour i allant de 1 à N-1 faire Si T[i]> T[i+1] alors Echanger(T[i], T[i+1]) ; Trie faux ; Finsi Finpour Fintantque 20 PSD 1ère MI 2015/2016 Chapitre 2 Les algorithmes de tri et de recherche II.3. La méthode de tri par insertion L’algorithme de tri par insertion repose sur le même principe que si on veut ordonner un ensemble de dossiers de patients. Ayant i-1 éléments déjà triées, on essaye de mettre le ième élément à sa place dans le tableau déjà trié. Ainsi de suite jusqu’à i=N. Exemple : [20, 6, 8, 1, 5] [20, 6, 8, 1, 5] ; [6, 20, 8, 1, 5] ; [6, 8, 20, 1, 5] ;[1, 6, 8, 20, 5] ; [1, 5, 6, 8, 20] Algorithme Pour i allant de 2 à N faire J i ; temp T[i] ; TQ (T[j-1]>temp) et (j>1) faire T[j] T[j-1] ; J j-1 ; finTQ T[j] temp ; Finpour Exercice1 : écrire un algorithme qui permet de lire un tableau de noms, puis le tri alphabétiquement et l’affiche en utilisant : - Une fonction qui retourne l’indice du plus petit élément dans un tableau à partir d’un indice donné ; Une procédure qui permet d’échanger deux éléments dans un tableau Une procédure tri_selec permettant de trier un tableau de chaîne de caractères (tri par sélection) Exercice2 : le même exercice avec le tri à bulles et le tri par insertion en précisant les procédures et / fonctions nécessaires. III. Recherche dans un tableau trié (recherche dichotomique) Exemple : considérons un dictionnaire dont chaque mot est classé dans une case d’un tableau. Imaginons que nous ayons 40000 mots. Nous cherchons ensuite si un mot est présent ou pas dans le dictionnaire. La première technique consiste à parcourir tout le tableau et à comparer les éléments avec le mot à chercher. Trouve faux; I 1 ; TQ (I<=N) et (non trouve) faire 21 PSD 1ère MI 2015/2016 Chapitre 2 Les algorithmes de tri et de recherche Si val = T [I] alors Trouve vrai; Indice I ; Finsi finTQ Si trouve alors Ecrire (indice); finsi Ça marche mais ça peut-être long. Une autre approche consiste à comparer notre mot avec celui au milieu du tableau. S’il est antérieur, alors il se trouve (s’il existe) dans la première moitié du tableau. Sinon, il est dans la seconde. On refait le traitement avec la moitié du tableau qui nous intéresse. T: tableau des mots Prem, dern, milieu, indice: entiers Trouve: bouléen(le ùmot existe ou n’existe pas) Mot : le mot cherché Algorithme Trouvefaux; prem1; DernN; milieu N div 2 ; TQ (non trouve) et (prem<=dern) faire si T[milieu]=mot alors trouve vrai; indicemilieu ; sinon si (T[milieu]>mot) alors dern milieu-1; sinon premmilieu+1; finsi milieu (prem+dern)div 2 finsi finTQ Si trouve alors Ecrire (indice) finsi 22 PSD 1ère MI 2015/2016 Chapitre 2 Les algorithmes de tri et de recherche Exercice3 : complément à l’exercice 1, après tri du tableau lire un nom et chercher son indice dans le tableau. SOLUTION EXERCICE1 #include <iostream> #define max 10 using namespace std; int n; int indice(string t[], int id) { int idpp=id; for (int j=id+1; j<n; j++) if (t[j]<t[idpp]) idpp=j; return idpp; } void echange(string t[], int id1, int id2) { string s; s=t[id1]; t[id1]=t[id2]; t[id2]=s; } void tri_selec(string t[]) { for(int i=0; i<n-1; i++) { int k = indice(t, i); echange( t, k, i); } } int main () { string noms[max]; cout<<"donner le nombre de noms:"; do cin>>n; while ((n<=0) || (n>max)); for(int i=0; i<n; i++) 23 PSD 1ère MI 2015/2016 Chapitre 2 { cout<<"tapez le "<<i<<" ème nom:"; cin>>noms[i]; } tri_selec(noms); for(int i=0; i<n; i++) { cout<<endl<<noms[i]<<endl; } system("pause"); return 0; } Cout << donner la valeur a recherche ; Cin >> mot ; Trouve=false ; Prem=0 ; Dern=n-1 ; Milieu=(n-1) /2 ; While(( !trouve) && (prem<=dern)) { if (noms[milieu]==mot) {trouve=true ; Indice=milieu ; }else {if (noms[milieu]<mot) Prem=milieu+1 ; Else dern=mileu-1 ; Milieu=(prem+dern)/2 ;} } if 24 Les algorithmes de tri et de recherche