I. Tri par sélection :
Enoncé :
Soit à trier un tableau T de n entiers (3<=n<=30) dans l’ordre croissant en utilisant la méthode de tri par sélection.1. Analyse :
Analyse de la procédure saisie
DEF PROC saisie (var t :tab ; var n :entier) Résultat=t,n
Pour i de 1àn faire T[i]= donnée (¨t[¨,i, ¨ ]= ¨) Fin pour
Repeter
N=donnée(¨Donner la taille du tableau¨) Jusqu’a n dans [3..30]
Analyse de la procédure permuter DEF PROC permuter(var x,y :entier) Résultat=x,y
Aux ← x X ← y Y ← aux
Analyse de la fonction pos_min
DEF FN pos_min(v :tab ;m :entier) :entier Résultat=posmin
Posmin ← m
Pour k de m+1 à n faire
Si v[k] < v[posmin] alors posmin :=k Finsi
Fin pour
Pos_min ← posmin
Analyse de la procédure tri_selection DEF PROC tri_selection (var t :tab) Résultat=T trié
Pour i de 1 à n faire Pm ← pos_min(t,i)
Si t[pm]<> t[i] alors permuter(t[pm],t[i]) Finsi
Finpour
Analyse de la procédure affiche DEF PROC Affiche( t :tab) Résultat = Affichage Pour i de 1 à n faire Ecrire(t[i], ¨ ¨) finpour
Les algorithmes de tri et de
recherche
Analyse du pp
Résultat = Proc Affiche(t) Proc tri_selection(t) Proc Saisie(t,n)
2. Algorithmes :
Algorithme de la procedure Saisie
0) DEF PROC Saisie(var t :tab ; var n :entier) 1) Repeter
Ecrire(¨Donner la taille du tableau¨), lire (n) Jusqu’a n dans [3..30]
2) Pour i de 1àn faire
Ecrire (¨t[¨,i, ¨ ]= ¨), Lire(T[i]) Fin pour
3) Fin Saisie
Algorithme de la procedure Permuter 0) DEF PROC permuter(var x,y :entier) 1) aux ← x
2) X ← y 3) Y ← aux 4) Fin Permuter
Algorithme de la fonction Pos_min
0) DEF FN pos_min(v :tab ;m :entier) :entier 1) Posmin ← m
2) Pour k de m+1 à n faire Si v[k] < v[posmin] alors posmin :=k
Finsi Fin pour
3) Pos_min ← posmin 4) Fin Pos_min
Algorithme de la procedure tri_selection 0) DEF PROC tri_selection (var t :tab) 1) Pour i de 1 à n faire
pm ← pos_min(t,i) Si t[pm]<> t[i] alors permuter(t[pm],t[i]) Finsi
Finpour
2) Fin tri_selection
Algorithme de la procedure Affiche 0) DEF PROC Affiche( t :tab) 1) Pour i de 1 à n faire Ecrire(t[i], ¨ ¨) Finpour
Algorithme du pp 0) Début Tri_select 1) Proc saisie(t,n) 2) Proc Tri_selection(t) 3) Proc affiche(t) 4) Fin Tri_select
TNT Tab
Tableau de 30 entiers
TDO
OBJET TYPE ROLE
T, V n i,k x, y, aux
pm m saisie Tri_selection
Affiche Permuter
Pos_min
Tab Entier Entier Entier Entier Entier Procédure Procédure Procédure Procédure Fonction
Tableau d’entiers Taille du tableau
Compteur
Utilisés pour la permutation Position du minimum
Position à partir de la quelle on cherche le min Remplissage de T
Tri du tableau T dans l’ordre croissant Affichage des valeurs triées Permutation de deux entiers Recherche de la position du minimum
3. Traduction Pascal :
program tri_select;
uses wincrt;
type
tab=array[1..30] of integer;
var t:tab;
n:integer;
procedure saisie(var t:tab;var n:integer);
var i:integer;
begin repeat
write('Donner la taille du tableau '); readln(n);
until n in [1..30];
for i:=1 to n do begin
write('t[',i,']= ');
readln(t[i]);
end;
end;
procedure tri_selection(var t:tab);
var
i,pm:integer;
function pos_min(v:tab;m:integer):integer;
var
posmin,k:integer;
begin posmin:=m;
for k:=m+1 to n do
if t[k]<t[posmin] then posmin:=k;
pos_min:=posmin;
end;
procedure permuter(var x,y:integer);
var
aux:integer;
begin aux:=x;
x:=y;
y:=aux;
end;
begin
for i:= 1 to n do begin
pm:=pos_min(t,i);
if t[pm]<>t[i] then permuter(t[pm],t[i]);
end;
end;
procedure affiche ( t:tab);
var i:integer;
begin
for i:= 1 to n do write(t[i],' ');
end;
begin saisie(t,n);
tri_selection(t);
affiche(t);
end.
II. Tri à bulles :
Enoncé :
Soit à trier un tableau T de n entiers (3<=n<=30) dans l’ordre croissant en utilisant la méthode de tri à bulles.1.
Analyse :
Analyse de la procédure saisie
DEF PROC saisie (var t :tab ; var n :entier) Résultat=t,n
Pour i de 1àn faire T[i]= donnée (¨t[¨,i, ¨ ]= ¨) Fin pour
Repeter
N=donnée(¨Donner la taille du tableau¨) Jusqu’a n dans [3..30]
Analyse de la procédure permuter DEF PROC permuter(var x,y :entier) Résultat=x,y
Aux ← x X ← y Y ← aux
Analyse de la procédure tri_bulles DEF PROC tri_bulles (var t :tab) Résultat=T trié
Repeter
Echange ← faux Pour i de 1 à n-1 faire Si t[i] > t[i+1] alors permuter(t[i+1],t[i]) echange ← vrai Finsi
Finpour
Jusqu’à Echange=faux
Analyse de la procédure affiche DEF PROC Affiche( t :tab) Résultat = Affichage Pour i de 1 à n faire Ecrire(t[i], ¨ ¨) finpour
Analyse du pp
Résultat = Proc Affiche(t) Proc tri_bulles(t) Proc Saisie(t,n)
2. Algorithmes :
Algorithme de la procedure Saisie
0) DEF PROC Saisie(var t :tab ; var n :entier) 1) Repeter
Ecrire(¨Donner la taille du tableau¨), lire (n) Jusqu’a n dans [3..30]
2) Pour i de 1àn faire
Ecrire (¨t[¨,i, ¨ ]= ¨), Lire(T[i]) Fin pour
3) Fin Saisie
Algorithme de la procedure Permuter 0) DEF PROC permuter(var x,y :entier) 1) aux ← x
2) X ← y 3) Y ← aux 4) Fin Permuter
Algorithme de la procedure tri_bulles 0) DEF PROC tri_bulles (var t :tab) 1) Repeter
Echange ← faux Pour i de 1 à n-1 faire Si t[i] > t[i+1] alors permuter(t[i+1],t[i]) Echange ← vrai Finsi
Finpour
Jusqu’à Echange ← faux 2) Fin tri_bulles
Algorithme de la procedure Affiche 0) DEF PROC Affiche( t :tab) 1) Pour i de 1 à n faire 2) Ecrire(t[i], ¨ ¨) Finpour
3) Fin Affiche
Algorithme du pp
0) Début Tri_a_bulles 1) Proc saisie(t,n) 2) Proc Tri_bulles(t) 3) Proc affiche(t) 4) Fin Tri_a_bulles
TNT Tab
Tableau de 30 entiers
TDO
OBJET TYPE ROLE
T n i x, y, aux
Tab Entier Entier Entier
Tableau d’entiers Taille du tableau
Compteur
Utilisés pour la permutation
saisie Tri_bulles
Affiche Permuter
Procédure Procédure Procédure Procédure
Remplissage de T
Tri du tableau T dans l’ordre croissant Affichage des valeurs triées Permutation de deux entiers
2 Traduction Pascal :
program tri_a_bulles;
uses wincrt;
type
tab=array[1..30] of integer;
var t:tab;
n:integer;
procedure saisie(var t:tab;var n:integer);
var i:integer;
begin repeat
write('Donner la taille du tableau '); readln(n);
until n in [1..30];
for i:=1 to n do begin
write('t[',i,']= ');
readln(t[i]);
end;
end;
procedure tri_bulles(var t:tab);
var i:integer;
echange:boolean;
procedure permuter(var x,y:integer);
var
aux:integer;
begin aux:=x;
x:=y;
y:=aux;
end;
begin repeat
echange:=false;
for i:= 1 to n-1 do if t[i]>t[i+1] then begin
echange:=true;
permuter(t[i+1],t[i]);
end;
until echange=false;
end;
procedure affiche ( t:tab);
var i:integer;
begin
for i:= 1 to n do write(t[i],' ');
end;
begin saisie(t,n);
tri_bulles(t);
affiche(t);
end.
III. Tri par insertion :
program tri_insert;
uses wincrt;
type
tab=array[1..30] of integer;
var t:tab;
n:integer;
procedure saisie(var t:tab;var n:integer);
var i:integer;
begin repeat
write('Donner la taille du tableau '); readln(n);
until n in [1..30];
for i:=1 to n do begin
write('t[',i,']= ');
readln(t[i]);
end;
end;
Procedure Tri_insertion( var t : tab);
var i, j, k : integer;
begin for i:=2 to n do
begin k := t[i]; (* k est la valeur à insérer dans l'endroit approprié du tableau *)
(* On décale toutes les valeurs du tableau < k à droite pour vider une place pour k *) j := i - 1;
while (j >= 1) and (t[j] > k) do begin
t[j + 1] := t[j];
j := j - 1;
(* finalement la valeur k est insérée à son emplacement adéquat *) t[j + 1] := k;
end;
end;
procedure affiche (var t:tab);
var i:integer;
begin
for i:= 1 to n do write(t[i],' ');
end;
begin saisie(t,n);
tri_insertion(t);
affiche(t);
end.
IV. Recherche séquentielle :
program recherche_sequentielle;
uses wincrt;
type
tab=array[1..30] of integer;
var t:tab;
e,n:integer;
procedure saisie(var t:tab;var n:integer);
var i:integer;
begin repeat
write('Donner la taille du tableau '); readln(n);
until n in [1..30];
for i:=1 to n do begin
write('t[',i,']= ');
readln(t[i]);
end;
end;
function recherche(t:tab;x:integer):boolean;
var i:integer;
tr:boolean;
begin i:=0;
tr:=false;
repeat i:=i+1;
if x=t[i] then tr:=true;
until (tr) or (i=n);
recherche:=tr;
end;
begin saisie(t,n);
write('donner un entier '); readln(e);
if recherche(t,e) then write(e,' existe') else write(e,' n''existe pas');
end.
V. Recherche dichotomique :
program recherche_dichotomique;
uses wincrt;
type
tab=array[1..30] of integer;
var t:tab;
e,n:integer;
procedure saisie(var t:tab;var n:integer);
var i:integer;
begin repeat
write('Donner la taille du tableau '); readln(n);
until n in [1..30];
for i:=1 to n do begin
write('t[',i,']= ');
readln(t[i]);
end;
end;
function recherche(t:tab;x:integer):boolean;
var
d,g,i:integer;
begin g:=1;
d:=n;
repeat
i:=(d+g) div 2;
if x<t[i] then d:=i-1 else g:=i+1;
until (x=t[i]) or (g>d);
if x=t[i] then recherche:=true else recherche:=false;
end;
begin saisie(t,n);
write('donner un entier '); readln(e);
if recherche(t,e) then write(e,' existe') else write(e,' n''existe pas');
end.