Introsort
Découvreur ou inventeur | |
---|---|
Date de découverte | |
Problèmes liés |
Algorithme de tri,hybrid algorithm(en) |
Structure des données |
Pire cas | |
---|---|
Moyenne |
Introsortouintrospective sortest unalgorithme de tripar comparaisons. C'est une variante dutri rapideinventée parDavid Musseren 1997. Par rapport au tri rapide, Introsort a l'avantage d'avoir unecomplexitédans le pire cas.
Principe
[modifier|modifier le code]L'algorithme detri rapideest ralenti lorsque le pivot choisi se retrouve souvent au début ou à la fin du sous-tableau trié. Dans ce cas, la profondeur de récursion est enet le temps total en,ce qui est un temps comparable à untri par sélection.Mais en moyenne, letri rapideest efficace: sa complexité est.
Introsort, pour pallier cet inconvénient, utilise un compteur de récursion. Ainsi il mesure au fur et à mesure la profondeur de récursion en cours (d'où le nom de l'algorithme). Quand la profondeur dépasseoù K est une constante, on trie le sous-tableau restant avec un algorithme dont la complexité estdans tous les cas, par exemple untri par tasou unSmoothsort.
Tout comme letri rapide,Introsort peut être optimisé en triant les sous-listes de moins de 15 éléments avec untri par insertionou untri de Shell,au fur et à mesure, ou à la fin (principe deSedgesort).
Algorithme
[modifier|modifier le code]Avec A: Tableau et n = Longueur(A)
Faire Introsort(A, 2*PartieEntière(Log2(n)) )
- Procédure Introsort (A: Tableau[Min..Max], ProfondeurLimite: Entier > 0)
- Initialiser
- CurMin:= Min et CurMax:= Max
- Pivot:= A[PartieEntière((Min + Max) / 2)]
- Répéter jusqu'à ce que CurMin > CurMax
- Tant que A[CurMin] < Pivot, CurMin:= CurMin + 1
- Tant que A[CurMax] > Pivot, CurMax:= CurMax - 1
- Si CurMin < CurMax alors Echanger(A[CurMin], A[CurMax])
- CurMin = CurMin + 1
- CurMax = CurMax - 1
- Si CurMax > Min
- Si ProfondeurLimite = 1 alors faire Heapsort(A[Min..CurMax])
- Sinon faire Introsort(A[Min..CurMax], ProfondeurLimite - 1)
- Si CurMin < Max
- Si ProfondeurLimite = 1 alors faire Heapsort(A[CurMin..Max])
- Sinon faire Introsort(A[CurMin..Max], ProfondeurLimite - 1)
- Initialiser
Voir aussi
[modifier|modifier le code]- Tri rapide(quicksort)
- Tri par tas(heapsort)
Notes et références
[modifier|modifier le code]- (en)David R. Musser, «Introspective Sorting and Selection Algorithms»,Software: Practice and Experience,Wiley-Blackwell,vol.27,no8,,p.983-993(ISSN1097-024Xet0038-0644,DOI10.1002/(SICI)1097-024X(200005)30:6<617::AID-SPE311>3.0.CO;2-A).