• Aucun résultat trouvé

Les algorithmes de tri et de recherche

N/A
N/A
Protected

Academic year: 2022

Partager "Les algorithmes de tri et de recherche"

Copied!
1
0
0

Texte intégral

(1)

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

(2)

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

(3)

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]);

(4)

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.

(5)

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

(6)

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

(7)

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;

(8)

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;

(9)

(* 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;

(10)

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.

Références

Documents relatifs

Lorsqu’une base de données est très volumineuse et non ordonnée, trouver une information dans cette base est très long et très ingrat.. En effet la seule solution est

Dans le tri rapide, après les 2 tris partiels, tous les éléments de la partie gauche sont inférieurs au pivot, alors que tous les éléments de la partie droite... naturelle, et

procedure saisie(var t:tab;var n:integer);.

– partager la liste ` a trier en deux sous-listes : les ´ el´ ements plus petits que le nombre choisit puis les plus grands. – ` a la fin, on ins` ere le nombre choisit entre ces

&lt;latexit

[r]

Question : Est-il possible de trier un tableau de n ´el´ements en moins de n · log( n ) op´erations dans le pire cas. Non si on n’utilise que des comparaisons 2 `a 2 et sans

De ce fait, si on parcourt la tableau de gauche à droite, on positionne à chaque fois le plus petit élément qui se trouve dans le sous tableau droit. Ou plus généralement : Pour