Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire IFT 436 - Algorithmes et structures de données Algorithme de Tri Rachid Kadouche Université de Sherbrooke 11 juillet 2013 1 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Le problème Soit une séquence (a1 , a2 , . . . , an ). On veut une permutation (a10 , a20 , . . . , an0 ) tel que a10 ≤ a20 ≤ · · · ≤ an0 . 2 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Pourquoi trier ? Opération très souvent utilisée. Le tri est la tâche la plus fréquente effectuée par les ordinateurs Tri = préliminaire à la résolution efficace de beaucoup de problèmes une fois que les objets sont triés, ces problèmes deviennent simples 3 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Pourquoi trier ? Les ordinateurs font majoritairement du tri parce qu’ils font majoritairement de la recherche Exemples : Recherche d’un élément dans un tableau trié : recherche dichotomique complexité =Θ(lgn) Trouver parmi n nombres, les paires les plus proches. Si les n nombres sont triés, les nombres formant ces paires sont l’un à coté de l’autre. 4 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Pourquoi trier ? Exemples : (suite) Est-ce que n objets sont distincts ? Trier les n nombres, il suffit ensuite de parcourir la liste triée ! Base de données : suppression des dupliqués Calculer la fréquence d’occurrence d’un élément (de tous les éléments) parmi n Le kème plus grand élément Le traitement de données à large échelle serait impossible sans le tri ! 5 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Algorithme de tri Nous avons déjà vue : Tri-Insertion Meilleur cas : Θ(n) Pire cas : Θ(n2 ) Tri sur place Bon pour trier un petit nombre de valeur Tri-Fusion Tous les cas : Θ(n lg n) Ne tri pas sur place 6 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Le Tri par Tas (Heapsort) Proposé par Williams, J. W. J en 1964 O(n lg n) comme le Tri-Fusion Tri sur place comme le Tri-Insertion Particularité : utilise un Tas. 7 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Un Tas 8 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Un Tas 9 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Un Tas 10 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Procédures pour le Tri par Tas Entasser-Max : Maintient la propriété max d’un Tas. Construire-Tas-Max : Produit un Tas à partir d’un tableau. Tri-Par-Tas : Tri un tableau sur place. 11 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Entasser-Max Algorithme : Entasser-Max(A,i) l ← gauche(i); r ← droite(i); if l ≤ taille[A] and A[l] > A[i] then max ← l; else max ← i; if r ≤ taille[A] and A[r ] > A[max] then max ← r ; if max 6= i then échanger A[i] ↔ A[max]; Entasser-Max(A,max) ; 12 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Entasser-Max 13 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Construire-Tas-Max Algorithme : Construire-Tas-Max(A) n = taille[A]; for i ← bn/2c to 1 do Entasser-Max(A, i); Les éléments du sous tableau A [(bn/2c+1),...n]sont tous des feuilles de l’arbre. 14 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Construire-Tas-Max 15 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Construire-Tas-Max 16 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Analyse de Construire-Tas-Max Observons que : Un Tas de n éléments est de hauteur h = blg nc. La hauteur d’un noeud dans un tas est définie par le nombre d’arcs sur le chemin simple le plus long reliant le noeud à une feuille. Le nombre de noeuds ayant la hauteur h est au plus dn/2h+1 e. Le temps requis par Entasser-Max lorsqu’appelé sur un noeud de hauteur h est O(h). 17 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Analyse de Construire-Tas-Max Le temps d’exécution de Construire-Tas-Max peut donc être décrit par la formule suivante : T (n)Construire−Tas−Max = blg nc l X h=0 n m 2h+1 O(h) Cette formule s’interprète de la manière suivante : Pour chaque niveau, on multiplie le nombre de noeud à ce niveau par le coût d’un appel à Entasser-Max pour un noeud de ce niveau. 18 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Analyse de Construire-Tas-Max Le temps d’exécution de Construire-Tas-Max peut donc être décrit par la formule suivante : T (n)Construire−Tas−Max = blg nc l X h=0 n m 2h+1 O(h) Cette formule s’interprète de la manière suivante : Pour chaque niveau, on multiplie le nombre de noeud à ce niveau par le coût d’un appel à Entasser-Max pour un noeud de ce niveau. T (n)Construire−Tas−Max = O(n) (en utilisant la formule suivante : P ∞ i=0 19 i · xi = x (1−x)2 (si |x| < 1)) Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Algorithme du Tri par Tas 20 1 Construire un Tas-max. 2 Échanger la racine avec le dernier élément. 3 Décrémenter la taille du Tas de 1. 4 Appeler Entasser-Max sur la nouvelle racine. Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri par Tas Algorithme : Tri par Tas(A, n) Construire-Tas-Max(A,n); for i ← n to 2 do échanger A[1] ↔ A[i]; taille[A] ← taille[A] − 1; Entasser-Max(A,1) ; 21 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri par Tas Algorithme : Tri par Tas(A, n) Construire-Tas-Max(A,n); for i ← n to 2 do échanger A[1] ↔ A[i]; taille[A] ← taille[A] − 1; Entasser-Max(A,1) ; T (n) = O(nlgn) 22 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-Rapide Proposé par Tony Hoare 1962 Basé sur la stratégie de conception d’algorithmes diviser pour régner Cas moyen et meilleur cas Θ(n lg n) Pire cas : Θ(n2 ) Tri sur place. 23 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-Rapide Algorithme : Tri-Rapide(A, p, r) if p < r then q ← Partition(A, p, r); Tri-Rapide(A, p, q-1); Tri-Rapide(A, q+1, r); 24 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Partition Algorithme : Partition(A, p, q) x ← A[p]; i←p; for j ← p+1 to q do if A[j] ≤ x then i ← i + 1; swap(A[i], A[j]); swap(A[i], A[p]); return i; 25 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Partition Algorithme : Partition(A, p, q) x ← A[p]; i←p; for j ← p+1 to q do if A[j] ≤ x then i ← i + 1; swap(A[i], A[j]); swap(A[i], A[p]); return i; 26 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Partition 27 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Partition 28 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Partition 29 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Partition 30 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Partition 31 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Partition 32 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Partition 33 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Partition 34 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Partition 35 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Partition 36 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Partition 37 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Partition 38 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Principe du Tri-Rapide 1 2 3 4 39 A[p..i] ≤ pivot A[i + 1..j] > pivot A[p] = pivot A[j + 1..q] non-examinés Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Analyse du Tri-Rapide Algorithme : Tri-Rapide(A, p, r) if p < r then q ← Partition(A, p, r); Tri-Rapide(A, p, q-1); Tri-Rapide(A, q+1, r); L’appel initial est : Tri-Rapide(A, 1, n). 40 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Analyse du Tri-Rapide Algorithme : Tri-Rapide(A, p, r) if p < r then q ← Partition(A, p, r); Tri-Rapide(A, p, q-1); Tri-Rapide(A, q+1, r); L’appel initial est : Tri-Rapide(A, 1, n). T(n) dépend de la fonction Partition 41 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Partitionnement 42 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-Rapide aléatoire Algorithme : Partition-Randomisé(A, p, r) i ← random(p,r); swap(A[p], A[i]); return Partition(A, p, r); Algorithme : Tri-Rapide-Randomisé(A, p, r) if p < r then q ← Partition-Randomisé(A, p, r); Tri-Rapide-Randomisé(A, p, q-1); Tri-Rapide-Randomisé(A, q+1, r); 43 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Limite des tris par comparaison Tous les algo de tri vue à date sont des tris par comparaisons. Pour le pire cas ils sont Ω(n lg n). 44 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-Insertion Algorithme : Tri-Insertion(A) for j ← 2 to n do key ← A[j]; i ← j − 1; while i > 0 and A[i] > key do A[i + 1] ← A[i]; i ← i − 1; A[i + 1] ← key ; 45 Soit [6, 8, 5], on compare les éléments 1 : 2 (1 ≤ 2) Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-Insertion Algorithme : Tri-Insertion(A) for j ← 2 to n do key ← A[j]; i ← j − 1; while i > 0 and A[i] > key do A[i + 1] ← A[i]; i ← i − 1; A[i + 1] ← key ; 46 Soit [6, 8, 5], on compare les éléments 1 : 2 (1 ≤ 2) 2 : 3 (2 > 3) échange 8 ↔ 5 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-Insertion Algorithme : Tri-Insertion(A) for j ← 2 to n do key ← A[j]; i ← j − 1; while i > 0 and A[i] > key do A[i + 1] ← A[i]; i ← i − 1; A[i + 1] ← key ; 47 Soit [6, 8, 5], on compare les éléments 1 : 2 (1 ≤ 2) 2 : 3 (2 > 3) échange 8 ↔ 5 1 : 3 (1 > 3) échange 6 ↔ 5 Et on a [5, 6, 8] Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Arbre de décision Tri-Insertion sur 3 éléments [6, 8, 5] → [5, 6, 8] 48 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Arbre de décision Tri-Insertion sur 3 éléments [6, 8, 5] → [5, 6, 8] Branche la plus courte (meilleur cas) : n − 1 comparaisons Branche la plus longue (pire cas) : 49 n2 −n 2 comparaisons Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Preuve de la borne Ω(n lg n) Tout arbre binaire de hauteur h a ≤ 2h feuilles. Posons l = nombre de feuille. Alors l ≤ 2h Il y a au moins n! feuille dans un arbre de décision Théorème : Tout arbre de décision qui tri n éléments a une hauteur de Ω(n lg n) 50 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-par dénombrement Tri-par base (Herman Hollerith) Tri-par dénombrement Entrée : A[1..n], où A[j] ∈ {1, . . . , k} pour 1 ≤ j ≤ n. A, n et k sont donnés en paramètres. Sortie : B[1..n] trié. Mémoire auxiliaire : C [1..k] 51 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-par dénombrement Tri-par base (Herman Hollerith) Tri-par dénombrement Algorithme : Counting-Sort(A, n, k) 52 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-par dénombrement 53 Tri-par dénombrement Tri-par base (Herman Hollerith) Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-par dénombrement 54 Tri-par dénombrement Tri-par base (Herman Hollerith) Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-par dénombrement 55 Tri-par dénombrement Tri-par base (Herman Hollerith) Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-par dénombrement 56 Tri-par dénombrement Tri-par base (Herman Hollerith) Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-par dénombrement 57 Tri-par dénombrement Tri-par base (Herman Hollerith) Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-par dénombrement 58 Tri-par dénombrement Tri-par base (Herman Hollerith) Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-par dénombrement 59 Tri-par dénombrement Tri-par base (Herman Hollerith) Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-par dénombrement 60 Tri-par dénombrement Tri-par base (Herman Hollerith) Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-par dénombrement 61 Tri-par dénombrement Tri-par base (Herman Hollerith) Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-par dénombrement 62 Tri-par dénombrement Tri-par base (Herman Hollerith) Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-par dénombrement 63 Tri-par dénombrement Tri-par base (Herman Hollerith) Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-par dénombrement 64 Tri-par dénombrement Tri-par base (Herman Hollerith) Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-par dénombrement 65 Tri-par dénombrement Tri-par base (Herman Hollerith) Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-par dénombrement 66 Tri-par dénombrement Tri-par base (Herman Hollerith) Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-par dénombrement 67 Tri-par dénombrement Tri-par base (Herman Hollerith) Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-par dénombrement Tri-par base (Herman Hollerith) Tri-par dénombrement (Analyse) 68 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-par dénombrement Tri-par base (Herman Hollerith) Tri-par dénombrement Suppose que tous les éléments sont des entiers entre 1 et k. Lorsque k = O(n) alors T (n) = Θ(n) Le Tri-par dénombrement est stable. 69 Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-par base 70 Tri-par dénombrement Tri-par base (Herman Hollerith) Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-par base 71 Tri-par dénombrement Tri-par base (Herman Hollerith) Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-par base 72 Tri-par dénombrement Tri-par base (Herman Hollerith) Introduction Tri par Tas (Monceau, Heap) Tri-Rapide Limite des tris par comparaisons Tri en temps linéaire Tri-par base 73 Tri-par dénombrement Tri-par base (Herman Hollerith)