I21 Algorithmique et programmation II David Gross-Amblard, Joël Savelli IEM-uB GFDL 1.2 CM 6/8 v1.1
i21 IEM-UB GFDL Plan du cours I.Rappels sur Java - types, instructions, procédures, fonctions... II.Programmation par objet - classe, composition, héritage, initiation à la modélisation Bonus III.Types de données et algorithmes - listes, piles, files, arbres, algorithmes de tri, algorithmes récursifs
i21 IEM-UB GFDL Types de données et algorithmes 1.Récursivité 2.Algorithmes de tri 3.Types de données
i21 IEM-UB GFDL Types de données et algorithmes 1.Récursivité 2.Algorithmes de tri 2.1 Définitions 2.2 Tri par sélection 2.3 Tri par insertion 2.4 Tri par échange (tri à bulle, tri rapide) 2.5 Tri fusion 2.6 Comparaisons des méthodes 2.7 Défi à $ 1.Types de données
i21 IEM-UB GFDL Tri : définition ● Un tableau d'entier t est dit trié en ordre croissant si pour tout indice i<j, t[i]<=t[j] ● Un tableau d'entier t est dit trié en ordre décroissant si pour tout indice i =t[j] ● Ex : pas trié : trié en ordre croissant : ordre décroissant
i21 IEM-UB GFDL Tri : définition ● S'étend à n'importe quelle relation d'ordre ● Ex. tableau de chaînes, ordre alphabétique ''Spirou'' ''Zorglub'' ''Fantasio'' : pas trié ''Fantasio'' ''Spirou'' ''Zorglub'' : ordre croissant ''Zorglub'' ''Spirou'' ''Fantasio'' : ordre décroissant
i21 IEM-UB GFDL Tri : définition ● Plusieurs clés ● Ordre lexicographique : (a,b) < (c,d) ssi a<c ou (a=c et b<d) ● Ex. Ordre lexicographique sur nom puis prénom (Onyme,Jeanne) (Saisrien,Jean) (Onyme,Anne) : non trié (Onyme,Anne)(Onyme,Jeanne)(Saisrien,Jean) : ordre croissant (Saisrien,Jean)(Onyme,Jeanne)(Onyme,Anne): ordre décroissant
i21 IEM-UB GFDL Tri : définition ● Algorithme : description non-ambiguë des actions à effectuer pour réaliser une tâche donnée, indépendante du langage de programmation ● Programme (ou méthode) associé à un algorithme : sa traduction en un langage de programmation (ex. Java)
i21 IEM-UB GFDL Tri : définition ● Algorithmique : sciences des algorithmes ● Concevoir un algorithme : difficile ! Longue réflexion papier-crayon avant programmation ● (un) Algorithme de tri : (une) description des actions à effectuer pour trier une collection de données (ex. un tableau) ● Dans la suite, objectif : ordre croissant
i21 IEM-UB GFDL Types de données et algorithmes 1.Récursivité 2.Algorithmes de tri 2.1 Définitions 2.2 Tri par sélection 2.3 Tri par insertion 2.4 Tri par échange (tri à bulle, tri rapide) 2.5 Tri fusion 2.6 Comparaisons des méthodes 2.7 Défi à $ 1.Types de données
i21 IEM-UB GFDL Tri par sélection ● Principe : – trouver le minimum du tableau – le placer en tête du tableau – recommencer avec le reste du tableau ● Tri par sélection directe : parcours séquentiel du tableau pour trouver le minimum
i21 IEM-UB GFDL Tri par sélection directe : exemple | (2) 2| (3)6 2 3| (5) | etc |fini ● |fin de la partie triée, () minimum
i21 IEM-UB GFDL Tri par sélection directe ● Algorithme : triSelectionDirecte(tableau t) pour i allant de 0 à taille(t)-2 entier indiceMin = i; pour j allant de i+1 à taille(t)-1 si (t[j]<t[indiceMin]) indiceMin=j; échanger les valeurs de t[i] et t[indiceMin]
i21 IEM-UB GFDL Types de données et algorithmes 1.Récursivité 2.Algorithmes de tri 2.1 Définitions 2.2 Tri par sélection 2.3 Tri par insertion 2.4 Tri par échange (tri à bulle, tri rapide) 2.5 Tri fusion 2.6 Comparaisons des méthodes 2.7 Défi à $ 1.Types de données
i21 IEM-UB GFDL Tri par insertion ● Principe : – La partie gauche du tableau contient les données déjà triées – Pour tout nouvel élément, trouver sa position dans la partie gauche, et l'insérer ● Tri par insertion séquentielle : – parcourir séquentiellement le tableau pour trouver la position
i21 IEM-UB GFDL Tri par insertion séquentielle 2| (5) |(1) |(6) |(3) |(10) |(7) | fini
i21 IEM-UB GFDL Tri par insertion séquentielle ● Algorithme: triSequentiel(t) pour i allant de 2 à longeur(t)-1 courant=t[i] j=i-1 courantEstSupérieur=vrai tant que j>0 et courantEstSupérieur si t[j]<courant alors courantEstSupérieur=faux sinon t[j+1]=t[j] j=j-1 t[j+1]=courant
i21 IEM-UB GFDL Types de données et algorithmes 1.Récursivité 2.Algorithmes de tri 2.1 Définitions 2.2 Tri par sélection 2.3 Tri par insertion 2.4 Tri par échange (tri à bulle, tri rapide) 2.5 Tri fusion 2.6 Comparaisons des méthodes 2.7 Défi à $ 1.Types de données
i21 IEM-UB GFDL Tri par échange ● Principe : tableau t non trié ● indice ● valeur ● Propriété (élémentaire) : si un tableau t n'est pas trié en ordre croissant, il existe i t[j] ● Par exemple : t[0]>t[1] ● Les échanger pour supprimer ce désordre local
i21 IEM-UB GFDL Tri à bulle (bubble sort) ● Principe : réorganiser localement le tableau de proche en proche jusqu'à ce qu'il ne subsiste plus aucun désordre ● Pour un indice i parcourant les indices du tableau – si t[i]>t[i+1], inverser t[i] et t[i+1] ● Si un désordre a été rencontré, recommencer ● Sinon, terminé
i21 IEM-UB GFDL Exemple ● 1er passage (12>11) : échange 11 (12> 10) : échange (12>9) : échange (12>5) : échange (12>8)3 6 2 : échange (12>3)6 2 : échange (12>6)2 : échange (12>2): échange : on a rencontré des désordres, on recommence
i21 IEM-UB GFDL Exemple ● 2eme passage : (11>10) : échange (11<12):pas d'échange – on a rencontré un désordre, on recommence ● A chaque fois, les petites valeurs remontent le tableau (les petites bulles vont vers la surface)
i21 IEM-UB GFDL Algorithme du tri à bulle ● Algorithme TriBulle (tableau t) booléen désordre faire désordre=faux pour entier i de 0 à taille(t)-2 si (t[i] > t[i+1]) inverser(t,i,i+1); désordre=vrai; tant que désordre
i21 IEM-UB GFDL Tri rapide (quick sort) Principe:Tri par échange et partition Tableau de taille 1, fini Sinon, choisir une valeur pivot dans le tableau (ex. milieu) Partition en 3 parties (gauche,pivot,droite) – (5) – (gauche) (pivot) (droite)
i21 IEM-UB GFDL Tri rapide – (5) – (gauche) (pivot) (droite) ● Partie gauche : transférer les éléments [x] plus grands que le pivot à droite – 2 [11] 3 [9] (5) – (gauche) (pivot) (droite) – 2 3 (5)
i21 IEM-UB GFDL Tri rapide ● Partie droite : transférer les éléments [x] plus petits que le pivot à gauche – 2 3 (5) 8 [4] – (gauche) (pivot) (droite) – ● Le pivot est alors à sa place définitive ● On recommence la même procédure sur la partie gauche, puis la partie droite ● Algorithme récursif !
i21 IEM-UB GFDL Tri rapide – 4 (2) – (2) – 2 (3) – (10) 11 9 – – (8) – ● (gras : positionné, () : pivot)
i21 IEM-UB GFDL Faire les partitions en place ● Tri en place : pas de nouveau tableau intermédiaire (contraire : tri par recopie) ● Astuce : deux curseurs dans la liste gauche et droite, partant des extrémités ● Sauter les valeurs bien placées ● Si on trouve une valeur mal placée de chaque côté, on les échange
i21 IEM-UB GFDL Partition en place (gauche) (pivot) (droite) : * curseurs (5) * * : 2,10 bien placées * * : 11,4 mal placées on permute (5) * * : 3,8 bien placées * * : 9,5 on permute (5) : fini
i21 IEM-UB GFDL Tri rapide ● Algorithme : triRapide(t,gauche,droite) i=gauche ; j=droite pivot=t[arrondi((i+j)/2)] répéter tant que t[i]<pivot faire i=i+1 tant que t[j]>pivot faire j=j-1 si (i<=j) alors échanger(t,i,j), i=i+1,j=j-1 tant que i<=j si (gauche<j) triRapide(1,gauche,j) si (droite>i) triRapide(1,i,droite)
i21 IEM-UB GFDL Tri rapide ● Pour tout trier : triRapide(t,0,taille(t)-1)
i21 IEM-UB GFDL Types de données et algorithmes 1.Récursivité 2.Algorithmes de tri 2.1 Définitions 2.2 Tri par sélection 2.3 Tri par insertion 2.4 Tri par échange (tri à bulle, tri rapide) 2.5 Tri fusion 2.6 Comparaisons des méthodes 2.7 Défi à $ 1.Types de données
i21 IEM-UB GFDL Tri fusion ● Algorithme récursif ● Supposons savoir trier un tableau de taille n ● Pour tableau de taille n+1 : – le couper en 2 parties de taille <= n – trier (récursivement) chaque partie (on sait faire) – fusionner (interclasser) le résultat (plus facile)
i21 IEM-UB GFDL ● ● ( )( ) ● (2 6 3) (8 5) (9 10) (11 12) ● (2 6)(3) (8)(5)(9)(10)(11)(12) ● (2)(6) ● taille 1 : tri évident Exemple : 1.dichotomie
i21 IEM-UB GFDL Exemple : 2.fusion (interclassement) ● ● ( )( ) ● (2 3 6) (5 8) (9 10) (11 12) ● (2 6) (3)(8)(5)(9)(10)(11)(12) ● (2) (6)
i21 IEM-UB GFDL Algorithme TriFusion (tableau tab,int gauche, droite) si gauche ≠ droite int median = arrondi ( gauche+ droite)/2; triFusion(tab,gauche,median); triFusion(tab,median+1,droite); fusion(tab,gauche,median,droite)
i21 IEM-UB GFDL Algorithme ● Fusion : 1 curseur sur chaque tableau à fusionner et comparaison ● A B ● (1) (2) > 1, avancer A ● 1 (4)6 8 (2) > 1 2, avancer B ● 1 (4)6 8 2 (5)8 9 -> 1 2 4, avancer A ● 1 4(6)8 2 (5)8 9 -> av. B ● etc. ● Quand l'un à fini : copier la fin de l'autre