Algorithmes de tri et de recherche Chapitre N°6: Algorithmes de tri et de recherche
Les méthodes de tri Tri par sélection Tri à bulle Tri par insertion 7 Trier = organiser et répartir un ensemble d’éléments selon un ou plusieurs critères 7 4 2 5 3 6 1 7 6 5 4 3 2 1
Les méthodes de tri Tri par sélection Tri à bulle Tri par insertion Activité: Ecrire une analyse, un algorithme et la traduction en PASCAL d’un programme qui permet de trier un tableau T de n éléments dans l’ordre croissant. Démo: Principe: Parcourir le tableau (n-1) fois A chaque itération, chercher la valeur minimale et la placer au début de la partie non triée en la permutant avec la première case
Les méthodes de tri Tri par sélection Tri à bulle Tri par insertion Analyse principale : Nom: Tri_selection Résultat= PROC Afficher (T, n) (T,n)= PROC Saisir (n) PROC Remplir (T, n) PROC Trier (T, n) Fin Tri_selection T.D.N.T: Type Tab=Tableau de 100 entiers T.D.O. globaux : Objet Type/Nature Rôle N entier Taille du tableau T Tab Tableau d’entiers Saisir procédure Saisie contrôlée de n Remplir Remplissage de T. Trier Afficher Affichage du tableau trié.
Les méthodes de tri Tri par sélection Tri à bulle Tri par insertion Analyse de la procédure Saisir : DEF PROC Saisir (var x : entier) Résultat= x x = [ ] Répéter n= donnée (" Saisir la taille du tableau : ") Jusqu’à ((x <= 100) et (x >=1)) Fin saisir Analyse de la procédure Remplir : DEF PROC Remplir (var T : Tab ; n: entier) Résultat= T T = [ ] Pour i de 1 à n faire T[i]=Donnée ("Saisir l’élément numéro ° ", i, " : ") Fin pour Fin remplir T.D.O.Locaux: Objet Type/Nature Rôle i entier Compteur
Les méthodes de tri Tri par sélection Tri à bulle Tri par insertion Analyse de la procédure Saisir : DEF PROC Saisir (var x : entier) Résultat= x x = [ ] Répéter n= donnée (" saisir la taille du tableau : ") Jusqu’à (x <= 100) et (x >=1) Fin saisir Analyse de la procédure Remplir : DEF PROC Remplir (var T : Tab ; n: entier) Résultat= T T = [ ] Pour i de 1 à n faire T[i]=Donnée ("saisir l’élément numéro ° ", i, " : ") Fin pour Fin remplir T.D.O.Locaux: Objet Type/Nature Rôle i entier Compteur
Les méthodes de tri Tri par sélection Tri à bulle Tri par insertion Analyse de la procédure Trier : DEF PROC Trier (var T : Tab ; n: entier) Résultat= T T= [ ] Pour i de 1 à n-1 faire pmin FN Recherche_pmin (T, n, i) Si(T[i]#T[pmin]) alors PROC Permuter (T[i], T[pmin]) Fin si Fin pour Fin Trier T.D.O.Locaux: Objet Type/Nature Rôle i Entier compteur Permuter procédure Permuter les contenus de deux variables Recherche_pmin fonction Rechercher l’indice du minimum pmin entier Position du minimum
Les méthodes de tri Tri par sélection Tri à bulle Tri par insertion Analyse de la fonction Recherche_pmin : DEF FN Recherche_pmin (T : Tab ; n: entier ; i : entier) Résultat= Recherche_pmin Recherche_pmin p p= [pi] Pour j de i+1 à n faire Si (T[p] > T[j]) alors p j Fin si Fin pour Fin Recherche_pmin T.D.O.Locaux: Objet Type/Nature Rôle j Entier Compteur p Position du minimum
Les méthodes de tri Tri par sélection Tri à bulle Tri par insertion Analyse de la procédure Permuter: DEF PROC Permuter (Var a, b: Entier) Résultat = (a, b) (a, b) = Aux a a b b Aux Fin Permuter T.D.O.Locaux: Objet Type/Nature Rôle Aux Entier Variable auxiliaire
Les méthodes de tri Tri par sélection Tri à bulle Tri par insertion Analyse de la procédure Afficher: DEF PROC Afficher (var T : Tab ; n: entier) Résultat= [ ] Pour i de 1 à n faire Ecrire (T[i]) Fin pour Fin Afficher T.D.O.Locaux: Objet Type/Nature Rôle i Entier compteur
Les méthodes de tri Tri par sélection Tri à bulle Tri par insertion Algorithme du programme principal 0) Début Tri_selection 1) PROC Saisir (n) 2) PROC Remplir (T, n) 3) PROC Trier (T, n) 4) PROC Afficher (T, n) 5) Fin Tri_selection Algorithme de la procédure Saisir: 0) DEF PROC saisir (var x : entier) 1) Répéter Écrire (" Saisir la taille du tableau : : ") Lire (x) Jusqu’à ((x <= 100) et (x >=1)) 2) Fin saisir
Les méthodes de tri Tri par sélection Tri à bulle Tri par insertion Algorithme de la procédure Remplir: 0) DEF PROC Remplir (var T : Tab ; n : entier) 1) Pour i de 1 à n faire Ecrire ("Saisir l’élément numéro ° ", i, " : ") Lire (T [i]) Fin pour 2) Fin Remplir Algorithme de la procédure Trier: 0) DEF PROC Trier (var T : Tab ; n : entier) 1) Pour i de 1 à n-1 faire pmin FN Recherche_pmin (T, n, i) si(T[i]#T[pmin]) alors PROC Permuter (T[i], T[pmin]) Fin si Fin pour 2) Fin Trier
Les méthodes de tri Tri par sélection Tri à bulle Tri par insertion Algorithme de la fonction Recherche_pmin : 0) DEF FN Recherche_pmin (T : Tab ; n: entier ; i : entier) 1) [pi] Pour j de i+1 à n faire Si (T[p] > T[j]) alors p j Fin si Fin pour 2) Recherche_pmin p 3)Fin Recherche_pmin Algorithme de la procédure Permuter: 0) DEF PROC Permuter (Var a, b: Entier) 1) Aux a 2) a b 3) b Aux 4) Fin Permuter
Les méthodes de tri Tri par sélection Tri à bulle Tri par insertion Algorithme de la procédure Afficher: 0) DEF PROC Afficher (var T : Tab ; n : entier) 1) Pour ide 1 à n faire Ecrire (T[i]) Fin pour 2) Fin Afficher
Les méthodes de tri Tri par sélection Tri à bulle Tri par insertion Traduction PASCAL: Program Tri_selection; p :=i; Uses wincrt; For j: =i+1 to n do Type tab=array [1..100] of integer; If (T[j]<T[p]) then p:=j; recherche_pmin:=p; Var T : tab; n : integer ; Procedure Trier (var T: tab; n: integer); Procedure Saisir (var n: integer); Var i, pmin: integer; Begin Repeat For i:=1 to n-1 do Write (‘Saisir la taille du tableau :'); Readln (n); pmin:= recherche_pmin (T, n, i); If (T[j]<>T[pmin]) then Until ( n [2..100]); Permuter(T[i],T[pmin]); End; Procedure Remplir (var T: tab; var n: integer); Var i: integer; Procedure Afficher (T: tab; n:integer); For i: =1 to n do Writeln ('Le tableau trié est : '); Write (‘Saisir l’’élément numéro °',i,' :') ; Writeln (T[i]); Readln (T[i]); Begin { Programme Principal } Saisir(n); Procedure Permuter (var a: integer; var b: integer); Remplir (T, n); Var Aux : integer; Trier (T, n); Afficher(T, n); Aux:=a; End. a:=b; b:=Aux; Functionrecherche_pmin(T:tab;n:integer;i:integer):integer; Var p, j : integer;
Les méthodes de tri Tri par sélection Tri à bulle Tri par insertion Principe: Parcourir le tableau tant de fois jusqu’à ce qu’il soit trié (aucune permutation faite) A chaque parcours: Comparer les éléments successifs et les permuter ,s’ils sont désordonnés Refaire l’action précédente jusqu’à l’avant dernier élément. Arrêter les itérations si aucune permutation n’est faite ( tableau trié) Démo:
Les méthodes de tri Tri par sélection Tri à bulle Tri par insertion Analyse de la procédure Trier : DEF PROC Trier_bulles (var T : Tab ; n: entier) Résultat = T T = [ ] Répéter echange faux Pour i de 1 à n-1 faire Si (T[i] > T [i+1]) alors PROC Permuter (T[i], T [i+1]) echange vrai Fin si Fin Pour nn-1 Jusqu'à ((n=1)ou(echange = faux)) Fin Trier T.D.O.Locaux: Objet Type/Nature Rôle i Entier compteur Permuter procédure Permuter les contenus de deux variables echange booléen Teste l‘état des permutations
Les méthodes de tri Tri par sélection Tri à bulle Tri par insertion Algorithme de la procédure Trier : 0) DEF PROC Trier (var T : Tab ; n: entier) 1) Répéter echange faux Pour i de 1 à n-1 faire Si(T[i] > T [i+1] ) PROC Permuter (T[i], T [i+1]) echange vrai Fin si Fin Pour n:=n-1 Jusqu'à ((n=1)ou(echange = faux)) 2) Fin Trier
Les méthodes de tri Tri par sélection Tri à bulle Tri par insertion Traduction Pascal de la procédure Trier : Procedure Trier (var T: tab; n: integer); Var echange: Boolean; i: integer; Begin Repeat echange: =false; For i: =1 to n-1 do If (T[i] > T [i+1] )then Permuter (T[i], T [i+1]); echange: =true; End; n:=n-1; Until ((n=1)or(echange = false));
Les méthodes de tri Tri par sélection Tri à bulle Tri par insertion Principe: Consiste à prendre Les éléments de la liste un par un ,en commençant, par le deuxième élément puis insérer chacun dans sa bonne place de façon que les éléments traités forment une sous liste triée. Répéter ce traitement jusqu'à arriver au dernier. Démo:
Les méthodes de tri Tri par sélection Tri à bulle Tri par insertion Analyse de la procédure Trier : DEF PROC Trier (var T : Tab ; n: entier) Résultat = T T = [ ] Pour i de 2 à n faire v T[i] j i PROC Decaler_d(T,j,v) PROC Inserer(T,j,v) Fin Pour Fin Trier T.D.O.Locaux: Objet Type/Nature Rôle i Entier compteur v Elément à insérer j Position de l’élément à insérer Decaler_d Procédure Décale les éléments du tableaux supérieur à l’élément à insérer vers la droite Inserer Insérer un élément dans sa bonne position
Les méthodes de tri Tri par sélection Tri à bulle Tri par insertion Analyse de la procédure Décaler_d : DEF PROC Decaler_d (VAR T:TAB; VAR p:Entier ; e:Entier) Résultat = T T=[ ]Tant que (T[p-1] > e) faire T[p] T[p-1] p p-1 Fin Tantque Fin Decaler_d Analyse de la procédure Inserer: DEF PROC Inserer (VAR T:TAB; p:Entier ; e:Entier) Résultat = T T[p] e Fin Inserer
Les méthodes de tri Tri par sélection Tri à bulle Tri par insertion Algorithme de la procédure Trier: 0) DEF PROC Trier (var T : Tab ; n: entier) 1) Pour i de 2 à n faire v T[i] j i PROC Decaler_d(T,j,v) PROC Inserer(T,j,v) Fin Pour 2) Fin Algorithme de la procédure Decaler_d : 0) DEF PROC Decaler_d (var T:TAB; var p:Entier ; e:Entier) 1) Tant que (T[p-1] > e) Répéter T[p] T[p-1] p p-1 Fin tantque 2) Fin PROC Decaler_d Algorithme de la procédure Inserer 0) DEF PROC Inserer (var T:TAB; p:Entier ; e:Entier) 1) T[p] e; 2) Fin PROC Inserer :
Les méthodes de tri Tri par sélection Tri à bulle Tri par insertion Traduction Pascal de la procédure Trier: PROCEDURE Trier(n:INTEGER ; var T: TAB); VAR i,j,v: INTEGER; PROCEDURE Decaler_d(var T:TAB; var p:INTEGER;e:INTEGER); BEGIN WHILE T[p-1] > e DO T[p] := T[p-1]; p:= p-1 END; PROCEDURE Inserer(var T:TAB; p:INTEGER; e:INTEGER); T[p] := e; FOR i := 2 TO n DO v := T[i]; j := i; Decaler_d(T,j,v); Inserer(T,j,v);
Recherche séquentielle Recherche dichotomique: Algorithmes de recherche: Recherche séquentielle Recherche dichotomique: Activité: Ecrire une analyse, un algorithme et la traduction Pascal d’un programme qui saisit un entier nature n suivit de n entiers à mettre dans un tableau T puis une valeur V, ensuite vérifier si V figure dans T u non. Démo: Principe: La recherche séquentielle vérifie l’existence d’un élément dans une série d’éléments. Elle consiste à parcourir la liste d’éléments un par un en les comparant avec la valeur recherchée jusqu’à trouver cette valeur ou atteindre la fin de la série.
Recherche séquentielle Recherche dichotomique: Algorithmes de recherche: Recherche séquentielle Recherche dichotomique: T: 70 15 102 31 42 37 22 1 2 3 4 5 6 7 V: 37 70 15 102 31 42 37 22 1 2 3 4 5 6 7 37 existe dans le tableau T
Recherche séquentielle Recherche dichotomique: Algorithmes de recherche: Recherche séquentielle Recherche dichotomique: T: 70 15 102 31 42 37 22 1 2 3 4 5 6 7 V: 19 70 15 102 31 42 37 22 1 2 3 4 5 6 7 19 n’existe pas dans le tableau T
Recherche séquentielle Recherche dichotomique: Algorithmes de recherche: Recherche séquentielle Recherche dichotomique: Analyse principale : Résultat= Ecrire ("Existe= ", exist) exist FN Recherche (T, n, v) V = PROC Saisie2 (v) T= PROC Remplir (T, n) n= PROC Saisie1 (n) Fin Recherche_sequentielle T.D.N.T: Type Tab=Tableau de 100 entiers T.D.O. globaux : Objet Type/Nature Rôle v entier Elément à rechercher n Taille du tableau T Tab Tableau d’entiers Saisie2 procédure Saisie de v (élément recherché) exist Booléen Résultat de la recherche Saisie1 Saisie contrôlée de n Remplir Remplissage de T.
Recherche séquentielle Recherche dichotomique: Algorithmes de recherche: Recherche séquentielle Recherche dichotomique: Analyse de la fonction Recherche : DEF FN Recherche (T : Tab ; n, v: entier) : Booléen Résultat= Recherche Recherche Trv Trv= [Trvfaux ; i 0] Répéter i i+1 Si (T[i] = v) alors Trv vrai Fin si jusqu'à (( i = n ) ou ( Trv=vrai)) Fin Recherche T.D.O. locaux : Objet Type/Nature Rôle i Entier compteur Trv Booléen Résultat du recherche
Recherche séquentielle Recherche dichotomique: Algorithmes de recherche: Recherche séquentielle Recherche dichotomique: Algorithme principale : 0)Début Recherche_sequentielle 1) PROC Saisie1 (n) 2) PROC Remplir (T, n) 3) PROC Saisie2 (v) 4) exist FN Recherche (T, n, v) 5) Ecrire (" Existe= ", exist) 6) Fin Recherche_sequentielle Algorithme de la fonction Recherche : 0)DEF FN Recherche (T : Tab ; n, e: entier ;):Booléen 1) Trvfaux ; i 0 Répéter i i+1 Si (T[i] = e) alors Trv vrai Fin si jusqu'à ((i = n ) ou ( Trv=vrai)) 2) Recherche Trv 3)Fin Recherche
Recherche séquentielle Recherche dichotomique: Algorithmes de recherche: Recherche séquentielle Recherche dichotomique: Traduction PASCAL: Program Recherche_sequentielle; Uses wincrt; Type tab=array [1..100] of integer; Var T : tab; n, v: integer ; exist: Boolean; Procedure Saisie1 (var n: integer); Begin Repeat Write ('Donner la taille du tableau :'); Readln (n); Until n >0; End; Procedure Remplir (var T: tab; var n: integer); Var i: integer; For i:=1 to n do Write ('Donner l''élément n°',i,' :') ; Readln (T[i]); Procedure Saisie2(var v: integer); Write ('Donner l''élément recherché :'); Readln (v); Function Recherche (T: tab; n, v: integer): Boolean; Var Trv: Boolean; i: integer; Begin Trv:=false; i:=0; Repeat i:=i+1; if T[i] = v then Trv:= true; until (Trv=true) or (i=n); Recherche :=Trv; End; BEGIN Saisie1 (n); Remplir (T, n); Saisie2 (v); exist:= Recherche(T, n, v); Writeln (‘Existe = ', exist) End.
Recherche séquentielle : Recherche dichotomique: Algorithmes de recherche: Recherche séquentielle : Recherche dichotomique: Activité: Ecrire une analyse, un algorithme et la traduction Pascal d’un programme qui saisit un entier nature n suivit de n entiers à mettre dans un tableau T puis une valeur V, ensuite vérifier si V figure dans T u non. Principe: La recherche dichotomique s’effectue à un tableau trié (Ordre croissant). On divise le tableau en deux parties égaux (à un élément prés). On compare l’élément à chercher avec l’élément du milieu Si elles ne sont pas égales, on s’intéresse uniquement à la partie contenant les éléments voulus et délaisse l’autre partie On recommence ces 3 étapes jusqu’à avoir un seul élément à comparer
Recherche séquentielle : Recherche dichotomique: Algorithmes de recherche: Recherche séquentielle : Recherche dichotomique: T: 9 15 18 22 31 37 42 54 70 102 1 2 3 4 5 6 7 8 9 10 V: 15 9 15 18 22 31 37 42 54 70 102 1 2 3 4 5 6 7 8 9 10 15 existe dans le tableau T
Recherche séquentielle : Recherche dichotomique: Algorithmes de recherche: Recherche séquentielle : Recherche dichotomique: T: 9 15 18 22 31 37 42 54 70 102 1 2 3 4 5 6 7 8 9 10 V: 50 9 15 18 22 31 37 42 54 70 102 1 2 3 4 5 6 7 8 9 10 50 n’existe pas dans le tableau T
Recherche séquentielle Recherche dichotomique: Algorithmes de recherche: Recherche séquentielle Recherche dichotomique: Analyse de la fonction Recherche : DEF FN Recherche (T : Tab ; n, v: entier) : Booléen Résultat= Recherche Recherche Trv A= [Trvfaux ; pini 1 ; pfinn] Répéter pmil (pini+ pfin) div 2 Si (T [ pmil] = v) alors Trv vrai Sinon si (T[pmil] < v) alors pini pmil +1 Sinon Pfin pmil - 1 fin si jusqu'à ((pini > pfin) ou (Trv=vrai)) Fin Recherche T.D.O. locaux : Objet Type/Nature Rôle pini Entier Compteur (position de début) pfin Compteur (position de fin) pmil Compteur (position de milieu) Trv Booléen Résultat du recherche
Recherche séquentielle Recherche dichotomique: Algorithmes de recherche: Recherche séquentielle Recherche dichotomique: Algorithme de la fonction Recherche : 0) DEF FN Recherche (T : Tab ; n, v: entier ;): Booléen 1) Trvfaux ; pini 1;pfin n ; Répéter pmil (pini + pfin) div 2 Si (T [p pmil mil] = v) alors Trv vrai Sinon si (T[pmil] < v) alors pini pmil +1 Sinon Pfin pmil - 1 Fin si Jusqu’à (pini > pfin) ou (Trv=vrai) 2) Recherche Trv 3)Fin Recherche
Recherche séquentielle Recherche dichotomique: Algorithmes de recherche: Recherche séquentielle Recherche dichotomique: Traduction PASCAL: Program Uses wincrt; Recherche_dichotomique; Type tab=array [1..100] of integer; Var T : tab; n, v: integer ; exist: Boolean; Procedure Saisie1 (var n: integer); Begin Repeat Write ('Donner la taille du tableau :'); Readln (n); Until n >0; End; Procedure Remplir (var T: tab; var n: integer); Var i: integer; For i:=1 to n do Write ('Donner l''élément n°',i,' :') ; Readln (T[i]); Procedure Saisie2(var v: integer); Write ('Donner l''élément recherché :'); Readln (v); function recherche(t:tab; n,v:integer):boolean; var Trv :boolean; pmil,pfin,pini:integer; begin Trv :=false; pini:=1; pfin:=n; repeat pmil:=(pini + pfin) div 2; if T[pmil] = v then Trv := true else if ( T[pmil] < v) then pini:=pmil+1 else pfin := Pmil - 1; until (Trv =true) or (pini>pfin); recherche:= Trv; End; BEGIN Saisie1 (n); Remplir (T, n); Saisie2 (v); exist:= Recherche(T, n, v); Writeln (‘Existe = ', exist) End.
Recherche dichotomique: Traduction PASCAL: Program Recherche_dichotomique; Uses wincrt; Type tab=array [1..100] of integer; Var T : tab; n, v: integer ; trv: Boolean; Procedure Saisie1 (var n: integer); Begin Repeat Write ('Donner la taille du tableau :'); Readln (n); Until n >0; End; Procedure Remplir (var T: tab; var n: integer); Var i: integer; For i:=1 to n do Write ('Donner l''élément n°',i,' :') ; Readln (T[i]); Procedure Saisie2(var v: integer); Write ('Donner l''élément recherché :'); Readln (v); function recherche(t:tab; n,v:integer):boolean; var Trv :boolean; mil,g,d:integer; begin Trv :=false; g:=1; d:=n; repeat mil:=(g + d) div 2; if T[mil] = v then Trv := true else if ( T[mil] < v) then g:=mil+1 else d := mil - 1; until (Trv =true) or (g>d); recherche:= Trv; End; BEGIN Saisie1 (n); Remplir (T, n); Saisie2 (v); exist:= Recherche(T, n, v); Writeln (‘Existe = ', exist) End.