Univ. Lille1 - Licence ST-A 1ère année 2009-2010 Algorithmes et Programmation Impérative 1 Trier un tableau 1 Exercices Exercice 4-1 Variante du tri par sélection Nous avons présenté le tri par sélection du plus petit élément de la tranche restant à trier. Il est possible aussi de faire un tri par sélection du plus grand élément. Question 1 Donnez l'algorithme de tri par sélection du plus grand élément. Question 2 Implantez cet algorithme pour réaliser une procédure qui trie par cette méthode le tableau passé en paramètre. Exercice 4-2 Tri à bulle L'algorithme 4.1 est un algorithme de tri dénommé tri à bulles qui est une certaine forme de tri par sélection du minimum. Algorithme 4.1 Algorithme du tri à bulles Entrée : t un tableau de longueur n. Sortie : t un tableau trié de longueur n contenant les mêmes éléments. 1: pour i variant de 0 à n − 2 faire 2: 3: 4: 5: 6: 7: 8: 9: 10: {mettre le plus petit élément de la tranche t(i..n − 1) en position i} pour j variant de n − 1 à i + 1 en décroissant faire si t(j) < t(j − 1) alors échanger t(j) et t(j − 1) n si n pour {La tranche t(0..i) est triée et ses éléments sont inférieurs ou égaux à tous les autres éléments de t.} n pour {la tranche t(0..n − 1) est triée.} Question 1 Donnez les états successifs du tableau à la n de chaque étape de la boucle pour située des lignes 3 à 7 lorsque i = 0 et le tableau à trier est 0 t= T 1 I 2 3 4 M O L 5 6 7 E O N . Question 2 Même question pour la n de chaque étape de la boucle pour située des lignes 1 à 9. Question 3 Combien de comparaisons d'éléments du tableau sont-elles eectuées lors du tri d'un tableau de longueur n ? Question 4 Si lors d'une étape de la boucle pour principale, aucun échange n'est eectué dans la boucle pour interne, c'est que le tableau est trié. Il est donc inutile de poursuivre la boucle externe. 1 Décrivez un algorithme qui tient compte de cette remarque. Question 5 Combien de comparaisons d'éléments du tableau sont-elles eectuées lors du tri d'un tableau de longueur n avec cette variante du tri à bulles ? Décrivez le meilleur et le pire des cas. Question 6 Réalisez une procédure qui trie le tableau passé en paramètre selon cet algorithme. Exercice 4-3 On modie l'algorithme de tri par insertion en eectuant la boucle dans l'ordre décroissant des indices : Entrée : t un tableau de longueur n. Sortie : t un tableau trié de longueur n contenant les mêmes éléments. 1: pour i variant de n − 1 à 1 en décroissant faire 2: inserer t(i) dans t(0..i) 3: n pour Question 1 quel est le tableau que l'on obtient lorsque cet algorithme est appliqué à 0 t= T 1 I 2 3 4 M O L 5 6 7 E O N ? Question 2 Qu'obtient-on si on applique cet algorithme sur un tableau trié dans l'ordre croissant ? décroissant ? Exercice 4-4 Trier les caractères d'une chaîne de caractères Réalisez avec l'algorithme de votre choix une fonction trie_chaine de type string → string qui construit la chaîne de caractères obtenues en triant les caractères de la chaîne passée en paramètre. Exercice 4-5 Passage de l'opérateur de comparaison en paramètre Les algorithmes de tris sont exposés en utilisant la relation ≤ entre éléments du tableau. Les implantations en Caml peuvent se faire en utilisant l'opérateur polymorphe <= qui, rappelons-le, est de type 0 a → 0 a → bool. Dans certaines situations, nous pouvons être amenés à ne pas utiliser cet opérateur prédéni, mais un autre opérateur déni par nos soins. Question 1 Réalisez une fonction de tri qui, outre le tableau à trier, prend aussi la fonction de comparaison en paramètre. Le type de cette fonction est donc (0 a → 0 a → bool) → 0 a array → 0 a array1 . De cette façon le tri d'un tableau d'entiers dans l'ordre croissant s'obtient par l'appel suivant # tri [|3;1;4;1;5;9;2|] (<=) ;; - : int array = [|1; 1; 2; 3; 4; 5; 9|] et le tri dans l'ordre décroissant s'obtient par # tri [|3;1;4;1;5;9;2|] (>=) ;; - : int array = [|9; 5; 4; 3; 2; 1; 1|] 1 ou bien 0 a array → (0 a → 0 a → bool) → 0 a array 2 Question 2 Soit t un tableau de couples dont la première composante est une chaîne de caractères, et la seconde un nombre entier. On veut trier le tableau par valeurs croissantes des premières composantes, et en cas d'égalité par valeurs croissantes des secondes composantes. Donnez une expression permettant de le faire. 3