TP4 - PRiSM

publicité
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
Téléchargement