Universit´e Paris 7 - Denis Diderot IF2 : Structures de donn´ees et Objets JAVA
L1 Sciences Ann´ee 2008-2009, 2`eme semestre
TD n3
Invariants et Algorithmes de Tri
L’objet de ce TD est de se familiariser avec les invariants de boucle et de manipuler diff´erents
algorithmes de tris et d’´etudier leur complexit´e. On se donne `a chaque fois un tableau d’entiers
et le probl`eme consiste `a modifier l’ordre des ´el´ements de telle sorte qu’ils soient tri´es apr`es
l’application de l’algorithme.
Exercice 1 Algorithme d’Euclide
Le but de l’exercice est d’´ecrire un programme qui calcule le pgcd ( plus grand commun diviseur)
de deux nombres entiers positifs ( non tous nuls) , `a l’aide de l’algorithme d’Euclide. Celui-ci
est bas´e sur la propri´et´e suivante : si aet b6= 0 sont deux entiers positifs , et si l’on note r1le
reste de la division euclidienne de apar b, alors pgcd(a, b) = pgcd(b, r1). L’id´ee de l’algorithme
est de recommencer la mˆeme op´eration sur le couple (b, r1) , ce qui donne un nouveau r2, on
poursuit avec le couple (r1, r2) et ainsi de suite , jusqu’`a tomber sur un reste rn+1 nul. On a
alors pgcd(a, b) = pgcd(b, r1) = pgcd(r1, r2) = · · · =pgcd(rn,0) ; or on voit imm´ediatement que
pgcd(rn,0) = rn.
1. Pourquoi est-ce que ce calcul termine ?
2. ´
Ecrivez la m´ethode pgcd bas´ee sur cet algorithme .
3. ´
Exhibez un invariant pour la boucle while permettant de justifier la correction du pro-
gramme.
Exercice 2 Recherche dichotomique
Le but est d’´ecrire une fonction de recheche d’une valeur dans un tableau d’entiers.
1. ´
Ecrire une m´ethode recherche() qui prend un tableau d ’entiers tab et une valeur enti`ere
xet qui retourne un indice itel que tab[i]=x , sinon la m´ethode retourne -1.
2. Dans le cas o`u le tableau est tri´e par ordre croissant , il est possible de retrouver plus
rapidement la valeur recherch´ee xpar dichotomie. Le principe est de comparer `a xla
valeur stock´ee au milieu du tableau : si elle est plus grande que x, il faut chercher dans
la moiti´e inf´erieur du tableau, et sinon dans la moiti´e sup´erieure. On recommence alors
sur la portion du tableau de taille moiti´e et ainsi de suite jusqu’`a trouver la valeur. ´
Ecrire
la m´ethode rechercheDichotomie() bas´ee sur cette approche. Identifier un invariant et
comparer la complexit´e de deux algorithmes.
Exercice 3 Tri par D´enombrement
Une m´ethode de tri applicable `a une situation particuli`ere : le tri par d´enombrement. Il s’agit
de trier une suite de nnombres entiers dont les valeurs sont comprises entre 0 et k.
Si kn’est pas tr`es grand on peut utiliser l’algorithme suivant :
1
Soit sle tableau contenant la suite , on calcule (`a l’aide d’un autre tableau auxiliare compte
de taille k+ 1), la fr´equence de chaque entier dans s.
On modifie compte de fa¸con `a avoir dans compte[i] le nombre d’´el´ements de sayant une
valeur inf´erieur ou ´egale `a i.
– On utilise le contenu de compte pour construire la suite tri´ee dans un deuxi`eme tableau
auxiliare ten utilsant l’instruction suivante :
pour tout iallant de n`a 1 par pas de 1 faire :
t[compte[s[i]] - 1] = s[i];
compte[s[i]]=compte[s[i]]-1;
finpour
On recopie la suite tri´ee dans le tableau s.
1. D´erouler l’algorithme de tri par d´enombrement sur le tableau :
A= [7,1,3,1,2,4,5,7,2,4,3]
2. ´
Ecrire une m´ethode pour calculer la fr´equence des ´el´ements d’une suite de nentiers positifs
ayant une valeur inf´erieure `a k.
3. ´
Ecrire une m´ethode qui effectue le tri par d´enombrement d’une suite de nentiers positifs
ayant valeur inf´erieure `a k.
Exercice 4 Tri par Distribution
Cette m´ethode s’applique aux tris de nombres et aux tris alphab´etiques. Si nous consid´erons
une suite de nombres nbc chiffres (ou une suite de mots de nbc caracrt`eres), le tri s’effectue par
distributions successives en consid´erant d’abord les chiffres des unit´es puis ceux des dizaines,
des centaines, etc . . .. `
A chaque passage nous formons des groupes de nombres suivant ce crit`ere
, puis nous reconstituons `a partir de ces groupes une nouvelle suite qui sera utilis´ee pour la
distribution suivante. Le nombre de distribution est ´egal au nombre de chiffres du plus grand
nombre.
Application sur une suite de nombre
Soit une suite de 12 nombres (d’au plus 3 chiffres ) :
3 127 37 51 18 172 25 45 7 33 11 131
Pour la premi`ere distribution , nous consid´erons le chiffre des unit´es et nous obtenons les groupes
suivants :
----------------------------------------------------------------------------
0123456789
----------------------------------------------------------------------------
51 172 3 25 127 18
11 33 45 37
131 7
Pour recr´eer la suite , nous prenons successivement les groupes form´es dans l’ordre croissant des
chiffres , soit :
2
51 11 131 172 3 33 25 45 127 37 7 18
En faisant maintenant la distibution suivant le chiffre des dizaines, nous obtenons les groupes
suivants :
----------------------------------------------------------------------------
0123456789
----------------------------------------------------------------------------
03 11 25 131 45 51 172
07 18 127 33
37
La nouvelle suite a alors la configurations ci-dessous :
03 07 11 18 25 127 131 33 37 45 51 172
Nous faisons la derni`ere distribution sur le chiffre des centaines :
----------------------------------------------------------------------------
0123456789
----------------------------------------------------------------------------
003 127
007 131
011 172
018
025
033
037
045
051
Et nous obtenons finalement les nombres tri´es :
003 007 011 018 025 033 037 045 051 127 131 172
1. ´
Ecrire une m´ethode qui retourne un tableau `a deux dimensions repr´esentant le tableau de
distribution pour le tableau `a trier suivant l’indice du chiffre :
0 : chiffre des unit´es ;
1 : chiffre des dizaines ;
2 : chiffre des centaines.
Les cases vides du tableau de distribution vont contenir l’entier -1
2. ´
Ecrire une m´ethode qui retourne un tableau `a partir d’un tableau de distribution.
3. ´
Ecrire l’algorithme de tri en utilisant les deux m´ethodes pr´ec´edentes.
3
1 / 3 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !