Tris Simples/Rapides
Sommaire Tri par bulles Tri par sélection Tri par insertion Comparaison des tris simples Tri Shell Tri rapide Chapitre 3 Data Structures & Algorithm, 2nd Edition, Robert Lafore
Tri par bulles Principe Parcourir le tableau en comparant 2 à 2 les éléments adjacents, et en les permutant si le premier des deux éléments est supérieur au second Après un premier balayage complet, le plus grand élément se trouve à l'indice n-1 Critère d’Arrêt : tableau restant à trier : un seul élément
Tri par bulles Principe (Premier balayage) Fin du premier balayage
Tri par bulles Principe (exemple)
Tri par bulles Principe (variantes possibles) Comparer uniquement les éléments qui ne sont pas remontés : itération i – comparaison des N-i premiers éléments Faire descendre les plus petites valeurs vers le début : parcours de droite vers la gauche Reprendre du début chaque fois qu'une permutation à été effectuée
Tri par bulles Principe (Invariants de l’algorithme) Certaines conditions restent inchangées durant l'algorithme. Rendant le Débogage plus facile, compréhension plus aisé. Dans le contexte du tri par bulles : Première itération : élément le plus important à la dernière position Deuxième itération : deuxième élément le plus important à l'avant dernière position les deux éléments les plus importants se trouvent aux bons emplacements L'invariant de la boucle est vrai à chaque itération
Efficacité de l'algorithme Tri par bulles Efficacité de l'algorithme Pour N éléments: Nombre de comparaisons : itération 1 : N-1 comparaisons itération 2 : N-2 comparaisons itération 3 : N-3 comparaisons (N-1) + (N-2) + (N-3) + …….+ 1 (N*(N-1)/2 N2/2
Efficacité de l'algorithme Tri par bulles Efficacité de l'algorithme Pour N éléments: Nombre de Permutations : Nombre de permutations est inférieur au nombre de comparaisons Données aléatoires : N2/4 Comparaisons et permutations : proportionnels à N2 Tri par bulles : O( N2)
Tri par bulles (Voir l’exemple TriABulle)
Tri par bulles (Voir l’exemple TriABulle suite ….)
Tri par bulles (Voir l’exemple TriABulle suite ….)
Tri par sélection Le tri par sélection est une autre variante du tri par bulles Nombre de permutations : O(N) Nombre de comparaisons reste le même O(N2) Principe au ième parcours, on considère que les i-1 premiers éléments sont triés à chercher le plus petit élément parmi les éléments non encore triés à le placer à la suite des éléments triés (i) => une seule permutation
Tri par sélection Principe
Tri par sélection Principe Itération 1 Itération 2 Itération 3
Tri par sélection Principe (exemple)
Tri par sélection Invariant: les i-1 éléments sont toujours triés. Efficacité du tri par sélection N*(N-1)/2 comparaisons N important : temps de comparaison très important Tri par sélection : O(N2) Plus rapide : à cause du faible nombre de permutations
Tri par sélection (Voir l’exemple TriParSelection)
Tri par sélection (Voir l’exemple TriParSelection suite …)
Tri par sélection (Voir l’exemple TriParSelection suite …)
Tri par insertion Principe N'utilise aucune fonction de permutation Déplace les éléments pour faire de la place pour chaque nouvel élément à insérer ième itération : déplacement d'un emplacement à droite de tous les éléments se trouvant à gauche de a [i] et supérieur à a [i] Insertion de a [i] au bon endroit
Tri par insertion Principe Itération i
Tri par insertion Principe (exemple)
Tri par insertion Invariant: Après chaque insertion : Les éléments dont l'indice est inférieur à outer (indice de la boucle externe) sont partiellement triés Efficacité du tri par insertion Comparaisons : Passe 1 : MAX: 1 comparaison Passe 2 : MAX: 2 comparaisons Passe 3 : MAX: 3 comparaisons … Passe N-1 : MAX: N-1 comparaisons MAX: N*(N-1)/2 Au cours de chaque passe : la moitié des items sont comparés en moyenne (N*(N-1)/4) Nombre de copies : égale au nombre de comparaisons Deux fois plus rapide que le tri par bulles Plus rapide que le tri par sélection Tri par insertion : O(N2)
Tri par insertion (Voir l’exemple TriParInsertion)
Tri par insertion (Voir l’exemple TriParInsertion suite ….)
Tri par insertion (Voir l’exemple TriParInsertion suite ….)
Tris simples (conclusion) Tous les algorithmes de tri simple sont stables Tri par bulles : plus simple Pratique si N est petit Tri par sélection : nombre de permutations réduit nombre de comparaisons reste élevé pratique Pour N petit et T permutation > T comparaison Tri par insertion : plus souple meilleur dans la plupart des situations
Tri Shell Le tri Shell proposé par Donald L. Shell constitue une variante optimisée du tri par insertion Tri Shell basé sur de nouvelles caractéristiques Amélioration de la performance du tri par insertion Plus rapide que le tri par sélection et le tri par insertion O(N2) Moins rapide que le tri rapide O(N*Log(N)) Facile à implémenter Tri Shell : éléments décalés de plusieurs espaces à la fois Incrément (pas) ; espace entre les éléments Réduction du nombre de pas : à chaque étape Affinage du tri pas = 1 => tri par insertion application du tri par insertion sur un tableau possédant un certain ordre
Tri Shell Exemple:
Tri Shell Exemple: Les items espacés de quatre cellules sont triés Quatre sous tableaux triés : (0, 4, 8) indices (1, 5, 9) indices (2, 6) indices (3, 7) indices Il en résulte un tableau presque trié Tri par insertion devient efficace : déplacement de l’élément d’au plus deux cellules O(N) Combinaison des deux : plus rapide que l’utilisation du seul tri par insertion
Tri Shell Choix de l'incrément (pas) Le choix du pas est fonction de la taille du tableau Réduction du pas à chaque étape La séquence de nombres utilisés pour générer l'intervalle est appelé séquence d'intervalle Le choix du pas ne doit pas se faire au hasard Les valeurs des différents pas ne doivent pas être des multiples des autres Important : réalisation de l'étape ou le pas est égal à un Le pas ne doit pas dépasser la taille du tableau Exemple : Tableau à N =1000 364, 121, 40, 13, 4, 1
Tri Shell Choix de l'incrément (pas): Séquence de Knuth
Tri Shell Voir l’exemple TriShell
Tri Shell Voir l’exemple TriShell (suite …)
Tri Shell Voir l’exemple TriShell (suite …)
Tri rapide (Quick sort) Partition Le tri rapide est basé sur un processus de partition appliqué de manière récursive Le processus de partition consiste à subdiviser le tableau à trier en deux sous tableaux définis ainsi : le sous tableau de gauche ne comporte que des éléments inférieur à une valeur de référence le sous tableau de droite ne comporte que des éléments supérieur à une valeur de référence Valeur Pivot : valeur de référence par rapport à laquelle les éléments sont regroupés (à gauche et à droite) La valeur de référence : valeur faisant partie du tableau
Tri rapide (Quick sort) Partition (algorithme) int partition( int left, int right, long pivot) { int leftPtr = left –1; int rightPtr = right +1; while (true) { while (leftPtr <right && theArray[++leftPtr] < pivot) ; // avancer while (rightPtr>left && theArray[--rightPtr] > pivot) ; // avancer if (leftPtr >= rightPtr) break; else swap (leftPtr, rightPtr); // permuter } retun leftPtr; //retourne la limite de la première partition }
Tri rapide (Quick sort) Partition (algorithme: efficacité) O(N) Temps d'exécution proportionnel au nombre d'éléments Nombre de permutations inférieur au nombre de comparaisons Comparaison et permutation proportionnelles à N
Tri rapide (Quick sort) Tri rapide, dans la majorité des situations est : O(Nlog2N) Principe : Le tri rapide fonctionne en partitionnant le tableau à trier en deux sous tableaux Trie récursivement chaque sous tableau : partition du sous tableau en deux etc. Sélection du pivot et tri des petites partitions La méthode de partition est modifiée : pivot à la dernière position
Tri rapide (Quick sort) Tri rapide (Algorithme) void recQuickSort(int left, int right) { if (right-left <= 0) return; // taille est 1 else { long pivot = theArray[right]; // choix du pivot int partition = partitionIt(left, right, pivot); recQuickSort(left, partition-1); recQuickSort(partition+1, right); } }
Tri rapide (Quick sort) Analyse de l'algorithme Sélection du pivot : médian de toutes les valeurs à trier Division du tableau en deux tableaux de même taille Sélectionner le médian parmi le premier, le dernier et celui du centre
Tri rapide (Quick sort) Voir l’exemple TriRapideVersionMedianofThreePartionning
Tri rapide (Quick sort) Voir l’exemple TriRapideVersionMedianofThreePartionning (suite …)
Tri rapide (Quick sort) Voir l’exemple TriRapideVersionMedianofThreePartionning (suite …)
Tri rapide (Quick sort) Voir l’exemple TriRapideVersionMedianofThreePartionning (suite …)