Université Paris 7 - Denis Diderot L1 Sciences IF2 : Structures de données et Objets JAVA Année 2008-2009, 2ème semestre TP n◦4 Algorithmes de Tri, la suite Ce TP complète le TP3. Le but est de manipuler des algorithmes de tri vus en cours et de comparer leur efficacité. Comme dans le TP3 on se donne à chaque fois un tableau d’entiers et le problème consiste à modifier l’ordre des éléments de telle sorte qu’ils soient triés après l’application de l’algorithme. Exercice 1 Tri Bulle Le principe d’une étape du tri bulle est le suivant : on dispose d’un tableau T d’entiers de taille n. On compare les éléments deux à deux et si celui de gauche est plus grand , on permute. On commence par les deux premiers , puis le deuxième et le troisième etc. jusqu’à comparer les éléments n-1 et n. 1. Appliquer la méthode ci-dessus sur le tableau T=[5,9,3,4,2]. 2. Écrire une méthode triBulle(int [] T) qui utilise cet algorithme pour trier un tableau passé en paramètre. 3. Combien cet algorithme fait-il de comparaisons, de permutations dans le meilleur et dans le pire des cas ? 4. Appliquer l’algorithme complet au tableau T ci-dessus. Exercice 2 Fusion de deux tableaux triés On considère deux tableaux triés d’entiers que l’on veut fusionner dans un troisième avec une complexité proportionnelle à la somme des tailles des deux tableaux. 1. Essayer d’effectuer cette fusion ”à la main” avec les deux tableaux suivants : t1 = 0 3 12 43 67 t2 = 1 3 7 18 72 81 2. Ecrire une méthode public static int[] fusion(int[] t1, int[] t2) qui retourne un tableau trié contenant tous les éléments des tableaux t1 et t2 passés en argument. 3. Vérifier que la complexité de l’algorithme est bien conforme aux spécifications : combien de comparaisons effectue-t-on dans le pire des cas ? dans le meilleur ? à quels cas cela correspond-il ? 4. Quels sont les invariants, préconditions et postconditions de l’algorithme ? Prouver le programme en n’oubliant pas la finitude. 5. Appliquer l’algorithme complet aux tableaux t1 et t2 ci-dessus. 1 Exercice 3 Tri Fusion Le tri fusion est un algorithme de type “Diviser pour régner”. Il repose sur le fait que la fusion de deux tableaux triés est rapide, comme nous l’avons vu dans l’exercice précédent. L’algorithme s’effectue récursivement de la manière suivante : – si le tableau a une seule case, il est trié – sinon on découpe le tableau en deux parties de même taille (ou à une case près si la taille est impaire) – on trie ces deux parties – on fusionne les parties triées. 1. Ecrire une méthode public static int[] division(int[] tab, int i, int j) retournant un tableau de longueur j − i + 1 contenant les valeurs de tab entre les valeurs i et j incluses. Quelle est sa complexité ? 2. En utilisant les méthodes fusion et division, écrire une méthode récursive public static int[] trifusion(int[] tab) qui retourne le tableau tab trié dans l’ordre croissant selon l’algorithme spécifié. Tester le programme. 3. Quelle est la complexité totale de l’algorithme ? Comparer avec les versions présentées en cours : quelles sont les différences ? quelles sont les versions les plus efficaces ? 4. Comparer les différents tris vus en cours (à bulle, sélection, insertion,tri fusion, tri rapide) : lesquels sont les plus rapides ? quelles sont leurs caractéristiques ? Exercice 4 Tri Shaker (Exercice optionnel) On se propose dans cet exercice d’améliorer le tri à bulle en faisant les modifications suivantes : – limiter les parcours sans échanges. – mémoriser le plus grand indice à partir duquel les échanges ne se font plus, c’est à dire l’indice en dessous du quel le tableau est trié. – alterner les sens des parcours consécutifs afin de traiter le cas où les éléments mal placés se trouvent en début de tableau. Utiliser les trois remarques précédentes pour écrire un algorithme améliorant le tri à bulle. Ce tri s’appelle tri shaker. Exercice 5 Récursivité croisée 1. Écrire deux méthodes Droit et Penche mutuellement récursives qui permettent, dans un environnement graphique, de construire les deux figures suivantes (on utilisera la fonction Deug.drawLine(x1,y1,x2,y2)) : 2. Et avec une seule méthode récursive ? 2