Les algorithmes de tri et de recherche

publicité
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
Trouvefaux;
prem1;
DernN;
milieu N div 2 ;
TQ (non trouve) et (prem<=dern) faire
si T[milieu]=mot alors
trouve vrai;
indicemilieu ;
sinon
si (T[milieu]>mot) alors
dern milieu-1;
sinon
premmilieu+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
Téléchargement