algo feuille10 1996-1997

Transcription

algo feuille10 1996-1997
IUT d'Orsay, Département Informatique
Algorithmique 1ère année, 2005-2006
Feuille de TD n°13 : Tris élémentaires
Exercice 1 : Tri sélection et tri insertion : simulation
Simuler le tri par sélection et le tri par insertion sur l’exemple ci-dessous, en répondant
directement sur l’annexe.
procédure triInsertion (tab, nbre)
{recherche pour chaque élément la case où il doit être affecté et y place cet élément}
paramètres (D/R) tab: tableau [1, MAX] d'entiers
(D) nbre: entier
variables indVal, numPlace: entiers
début
pour indVal Å 2 à nbre faire
{recherche de 1'endroit où doit s'insérer la valeur placée en indVal}
(a)
numPlace Å insertion(tab, nbre, indVal)
{si la valeur n'est pas à insérer en fin de zône triée, l'insérer à la place voulue}
(b)
si (numPlace ≠ indVal ) alors
{libère la position numPlace par décalage et y place tab[indVal]}
décalerEtPlacer(tab, numPlace, indVal)
fsi
fpour
fin
procédure triSélection (tab, nbre)
{recherche pour chaque case l'élément qui doit y être affecté et y place cet élément}
paramètres (D/R) tab: tableau [1, MAX] d'entiers
(D) nbre: entier
variables indDuMin, position: entiers
début
pour position Å 1 à nbre -1 faire
{recherche l’indice de l’élément minimum entre position et la fin de tab}
(a)
indDuMin Å sélection(tab, position, nbre)
{échange deux positions dans tab}
(b)
échanger(tab, position, indDuMin)
fpour
fin
Exercice 2 : Tri sélection et tri insertion : complexité
On souhaite trier les entiers 6, 5, 4, 3, 2, et 1. Répondre aux questions suivantes pour chacun des
deux algorithmes de tris étudiés dans la question précédente.
a. Donner dans un tableau les étapes successives de ce tri.
b. Combien de comparaisons et d’affectations fait-on pour trier ces 6 entiers ?
c. On suppose qu’on a plus généralement les n premiers entiers rangés dans l’ordre inverse.
Combien le tri sélection effectue-t-il de comparaisons et d’affectations ?
d. Répondre à la même question pour les entiers rangés dans le bon ordre 1, …, n.
Quelles conséquences peut-on en tirer ?
Feuille de TD n° 13, Algorithmique, Tris
Page 1
Algorithmique 1ère année, 2005-2006
IUT d'Orsay, Département Informatique
Exercice 3 : Tri bulle
On considère ici le tri bulle présenté en amphi. On rappelle que le principe de ce tri consiste à
effectuer des parcours successifs d’un tableau, en effectuant une permutation des éléments
successifs qui ne sont pas dans l’ordre. A la fin du parcours, le plus grand élément s’est déplacé
jusqu’à la dernière case du tableau. Pour trier, on effectue des parcours successifs jusqu’à ce que
tous les éléments soient en place.
a) Sur l’exemple fourni en annexe, simuler chaque étape des parcours en recopiant l’état du
couple de valeurs considérées, après comparaison et permutation éventuelle.
On désire écrire une version du tri bulle qui, une fois un parcours effectué, indique si oui ou non des
permutations ont été faites.
b) Expliquer pourquoi la liste est ordonnée si et seulement si aucune permutation n’a été
effectuée.
c) Ecrire une fonction parcours qui effectue un parcours de gauche à droite dans la suite
de nombres pour remettre de l’ordre, suivant l’algorithme expliqué ci-dessus, et qui
retourne un booléen indiquant si la suite était déjà triée au départ.
d) Quel est le nombre de tests effectués par la fonction parcours ? Quel est le nombre
maximal de permutations effectuées par cette même fonction ?
e) Ecrire la procédure triBulle qui effectue autant de parcours que nécessaire pour trier la
suite par ordre croissant.
f) Comparer la complexité de ce tri avec celle des tris traités dans le premier exercice.
Exercice 4 : Tri indirect
Cet exercice reprend l’étude du tri indirect vu en cours. Il s’agit d’une liste de fichiers que
l’on veut pouvoir trier à la fois par ordre croissant des noms, des tailles et des dates de création. Les
informations concernant chaque fichier sont représentées par un agrégat de type Fichier (contenant
les champs nom, taille, et dateCréation), et la liste des fichiers du répertoire courant est mémorisée
dans un tableau répertoire. Par exemple, le répertoire suivant contient 3 fichiers, de nom toto.C,
toto.o et toto.
1
nom toto.C
taille 20457
dateCréation 12.05.01
2
toto.o
3456
13.05.01
3
toto
5248
15.05.01
…
On dispose également de trois tableaux triés, triéParNom, triéParTaille, triéParDate,
chacun trié selon un critère différent. Pour éviter d'y recopier toutes les informations concernant les
fichiers du répertoire concerné, les tableaux triés ne contiendront pas les agrégats de type Fichier,
mais les indices des fichiers dans le tableau Répertoire. Par exemple, pour le répertoire donné cidessus :
triéParNom
3
1
2
triéParTaille
2
3
1
triéParDate
1
2
3
Feuille de TD n° 13, Algorithmique, Tris
Page 2
IUT d'Orsay, Département Informatique
Algorithmique 1ère année, 2005-2006
a) Ecrire une procédure afficheNom qui affiche par ordre alphabétique les nom des fichiers
d'un répertoire donné.
b) Modifier l'algorithme de tri par insertion afin qu'il puisse construire les tableaux
triéParNom, triéParTaille, et triéParDate. L'en-tête de la procédure sera :
Procédure triInsertion(tabFic, nbElt, méthode, tabTrié)
où tabFic est le tableau des fichiers, nbElt le nombre de fichiers, méthode l'un des
caractères 'N', 'T' ou 'D' pour indiquer le type de tri (nom, taille ou date), et tabTrié un
tableau d'indices.
*Exercice 5 : Trions nos joueurs
On utilise dans cet exercice une version simplifiée d’une représentation des licenciés de la
Fédération Française de Tennis: on note uniquement le numéro de club et le nom de chaque
licencié, et on utilise pour ces derniers un agrégat Licencié :
Type Licencié = agrégat
num: entier
nom: chaine
fin
{ numéro du club }
{ nom du licencié }
Pour mémoriser l’ensemble des licenciés de la Fédération on considère une classe FFT définie de la
manière suivante (MAXLIC est une constante entière représentant le nombre maximum de
licenciés) :
Classe FFT
Attributs
tlic: tableau[1,MAXLIC] de Licenciés
nlic: entier
{nombre de licenciés dans tlic }
estTriéC: booléen
{VRAI si tlic est trié par numéro croissant de club}
estTriéCN: booléen
{VRAI si tlic est trié par numéro de club, et
par nom, à l'intérieur d'un même club }
Méthodes . . .
Dans les exemples, on utilise la notation (120, Ali) pour désigner le licencié de nom Ali, dans le
club de numéro 120. Voici par exemple les attributs d'un objet FFT, mémorisant 7 licenciés :
nlic = 7;
tlic = [(120,Anne), (110,Tom), (120,Ali), (110,Paul), (130,Juju), (120,Yannis), (120,Bob)]
estTriéC = FAUX
estTriéCN = FAUX
Cet exercice étudie une façon de trier le tableau tlic.
a) L’algorithme suivant est une variante d’un tri étudié en cours. De quel tri s’agit-il ? Où se
situe la différence ?
Procédure tri(tab, n)
{ Tri, par ordre croissant des n premiers éléments du tableau tab ;condition d'emploi: n ≥ 1 }
paramètres
(D) n : entier
(D/R) tab : tableau[1, MAXLIC] de réels
Feuille de TD n° 13, Algorithmique, Tris
Page 3
IUT d'Orsay, Département Informatique
variables
Algorithmique 1ère année, 2005-2006
i, j, imax : entiers
aux : réel
début
pour j ← n à 2, pas -1, faire
imax ← 1
pour i ← 2 à j faire
si tab[imax] < tab[i] alors imax ← i
fpour
aux ← tab[imax]
tab[imax] ← tab[j]
tab[j] ← aux
fpour
fin
b) En adaptant cet algorithme, écrire une méthode de la classe FFT, de nom triClub, qui trie,
sur le seul numéro de club, les nlic éléments du tableau tlic, d'un objet de classe FFT, et
qui met le booléen estTriéC à VRAI.
Par exemple, l'objet FFT donné ci-dessus, devient, après appel de la méthode triClub :
nlic = 7;
tlic = [(110,Tom), (110,Paul), (120,Anne), (120,Ali), (120,Yannis), (120,Bob), (130,Juju)]
estTriéC = VRAI
estTriéCN = FAUX
c) Ecrire une méthode triNom(m,n) qui trie, sur le nom du licencié, les éléments du tableau
tlic dont les indices sont compris entre les indices m et n (inclus) d'un objet de classe FFT.
Par exemple, appliqué à l'objet FFT ci-dessus, l'appel triNom(3,6) transforme le tableau
tlic en:
tlic=[(110,Tom), (110,Paul), (120,Ali), (120,Anne), (120,Bob), (120,Yannis), (130,Juju)]
d) On désire avoir le tableau de licenciés trié d'abord sur le numéro de club, puis trié sur le
nom des licenciés dans un même club. Pour cela on commence par trier tout le tableau sur le
numéro de club puis on trie par des appels à triNom(m,n) pour chaque couple d'indices
(m,n) désignant tous les licenciés d'un même club.
Ecrire une MProcédure triClubNom() qui trie le tableau tlic d'un objet FFT, pour qu'il soit
trié d'abord sur le numéro de club, puis sur le nom des licenciés dans un même club; cette
méthode doit aussi mettre le champ estTriéCN à VRAI.
Feuille de TD n° 13, Algorithmique, Tris
Page 4
Algorithmique 1ère année, 2005-2006
IUT d'Orsay, Département Informatique
ANNEXE
Feuille n°12 : Tris élémentaires
Tri par insertion
rang
ind
instruc- Val
tion
tab[1] tab[2] tab[3] tab[4] tab[5] tab[6] valeur
à
insérer
10
-3
7
14
-5
valeur
décalage
retournée à faire ?
par
insertion
10
Tri par sélection
rang
num tab[1] tab[2] tab[3] tab[4] tab[5] tab[6] valeur
instruc- Place
retournée
tion
par
sélection
10
-3
7
14
-5
10
Feuille de TD n° 13, Algorithmique, Tris
Page 5