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