Insertion Sort (tableau)
Transcription
Insertion Sort (tableau)
Tris quadratiques Révision Tri par insertion Tri par sélection Tri à bulle (Bubble Sort) CSI2510 1 Insertion Sort (tableau) 0 1 2 3 i 2 4 6 8 10 15 5 trié 0 1 2 3 2 4 6 n 3 20 7 x i 8 10 15 n 5 3 5 x 20 7 20 7 trié 0 1 2 3 2 4 5 CSI2510 CSI2510 i+1 6 trié 8 10 15 3 n 2 1 for (i=2; i=n, i++) x ← A[i] A[0] ← x j ← i-1 while x.key < A[j].key A[j+1] ← A[j] j ← j-1 A[j+1] ← x 0 1 2 3 i 2 4 6 8 10 15 5 trié n 3 20 7 x CSI2510 Complexité 3 Insertion sort pour tableaux Comparaisons: (Ci)min = 1 MIN i=2..n Cmin = n-1 = O(n) (deja trié) n (Ci)max = i MAX Cmax = i=2..n i i =2 (trié en ordre invers) = [n(n+1)/2] – 1 = O(n2) Et avec une liste chaînée ? CSI2510 CSI2510 4 2 Complexité Insertion sort pour tableaux Nb. de déplacements et d’affectations idem Nb. de comparaisons Et avec une liste chaînée ? CSI2510 5 CSI2510 6 Selection Sort (tableaux) CSI2510 3 Selection Sort (tableaux) 1 2 i 3 5 6 15 n 8 Trie et ≤ des autres for (i=1; i= n-1, i++) k ← i x ← A[i] for (j=i+1; j=n, j++) if A[j].key < x.key k ← j x ← A[j] A[k] ← A[i] A[i] ← x 12 13 20 x Chercher la plus petite clé CSI2510 7 Complexité de Selection Sort (tableau) Nb. de comparaisons ne dépend pas de l’ordre des clés n-1 C= (n – i) = n(n – 1) – n(n – 1) / 2 i=1 = n(n – 1) / 2 = O(n2) Et avec une liste chaînée ? CSI2510 CSI2510 8 4 Complexité de Selection Sort (tableau) Nb. de d’affectations et de déplacements: MIN MAX Tableau déjà trié (Di)max = i (i=2..n) (trié en ordre inverse) Dmin = n-1 = O(n) Dmax = n "1 ! (n " i ) i =1 = O(n2) CSI2510 9 Tri à bulle (Bubblesort) Un algorithme de tri assez simple Comme son nom l'indique, son principe consiste à “faire remonter" les éléments jusqu'à leur bonne position (comme des bulles d’air à la surface de l’eau) On compare successivement les paires d’éléments adjacents du tableau et on les permute si le premier est supérieur au second CSI2510 CSI2510 10 5 Faire monter le plus grand élément Traverser une collection d’éléments Parcourir le tableau du début vers la fin Déplacer le plus grand élément vers la fin du tableau en comparant les éléments deux par deux et en les permutant si besoin 1 2 3 4 5 6 77 42 35 12 101 5 CSI2510 11 Faire monter le plus grand élément Traverser une collection d’éléments Parcourir le tableau du début vers la fin Déplacer le plus grand élément vers la fin du tableau en comparant les éléments deux par deux et en les permutant si besoin 1 2 42Swap 77 42 77 3 4 5 6 35 12 101 5 CSI2510 CSI2510 12 6 Faire monter le plus grand élément Traverser une collection d’éléments Parcourir le tableau du début vers la fin Déplacer le plus grand élément vers la fin du tableau en comparant les éléments deux par deux et en les permutant si besoin 1 42 2 3 35Swap35 77 77 4 5 6 12 101 5 CSI2510 13 Faire monter le plus grand élément Traverser une collection d’éléments Parcourir le tableau du début vers la fin Déplacer le plus grand élément vers la fin du tableau en comparant les éléments deux par deux et en les permutant si besoin 1 2 42 35 3 4 12Swap12 77 77 CSI2510 CSI2510 5 6 101 5 14 7 Faire monter le plus grand élément Traverser une collection d’éléments Parcourir le tableau du début vers la fin Déplacer le plus grand élément vers la fin du tableau en comparant les éléments deux par deux et en les permutant si besoin 1 2 3 4 5 6 42 35 12 77 101 5 Pas besoin de permuter CSI2510 15 Faire monter le plus grand élément Traverser une collection d’éléments Parcourir le tableau du début vers la fin Déplacer le plus grand élément vers la fin du tableau en comparant les éléments deux par deux et en les permutant si besoin 1 2 3 4 42 35 12 77 CSI2510 CSI2510 5 6 5 Swap101 101 5 16 8 Faire monter le plus grand élément Traverser une collection d’éléments Parcourir le tableau du début vers la fin Déplacer le plus grand élément vers la fin du tableau en comparant les éléments deux par deux et en les permutant si besoin 1 2 3 4 5 6 42 35 12 77 5 101 Le plus grand élément est placé à la bonne position CSI2510 17 Tri à bulles (Bubble sort) Seul le plus grand élément est bien placé dans le tableau Les autres éléments du tableau sont toujours en désordre Il faut « faire remonter » les autres éléments aux bonnes positions répéter la procédure 1 2 3 4 5 6 42 35 12 77 5 101 Le plus grand élément est placé à la bonne position CSI2510 CSI2510 18 9 Tri à bulles (Bubble sort) Si nous avons N éléments… Et si chaque fois nous faisons remonter un élément et nous le plaçons à la bonne position Alors nous répétons la procédure “faire remonter” N – 1 fois C’est garanti que nous allons placer correctement tous les N éléments après CSI2510 19 N-1 Faire monter tout les éléments 1 42 2 35 3 12 4 77 5 5 6 101 1 35 2 12 3 42 4 5 5 77 6 101 1 12 3 5 3 35 4 42 5 77 6 101 1 12 2 35 2 5 4 42 5 77 6 101 1 5 2 12 3 35 4 42 5 77 6 101 CSI2510 CSI2510 20 10 Tri a bulles(tableau) - Complexité Nb. de comparaisons (ne dépend pas de l’ordre): C= n "1 ! (n " i ) = n(n – 1) – n(n – 1) / 2 = n(n – 1) / 2 = O(n2) i =1 Nb. de déplacements et affectations: Dmin = 0 Tableau dans l’ordre Dmax= 3*C = O(n2) Tableau dans l’ordre inverse CSI2510 21 Tri a bulles(tableau) Et si le tableau est déjà trié ? Et si seulement quelques éléments ne sont pas en ordre et après quelques déplacements le tableau est trié ? Nous voulons pouvoir détecter ceci et “arrêter tôt” ! 1 5 2 12 3 35 4 42 CSI2510 CSI2510 5 77 6 101 22 11 Tri a bulles(tableau) Nous pouvons utiliser une variable booléenne pour déterminer si n'importe quelle permutation est arrivée pendant la dernière remontée d’élément Si aucune permutation n’est arrivée, alors nous savons que le tableau est déjà trié! Ce booléen “flag” a besoin d'être remis à l'état initial après chaque remontée d’élément CSI2510 CSI2510 23 12