Introsort

Un article de Wikipédia, l'encyclopédie libre.
Introsort
Découvreur ou inventeur
David Musser (en)[1]Voir et modifier les données sur Wikidata
Date de découverte
Problèmes liés
Algorithme de tri, hybrid algorithm (en)Voir et modifier les données sur Wikidata
Structure des données
Complexité en temps
Pire cas
Voir et modifier les données sur Wikidata
Moyenne
Voir et modifier les données sur Wikidata

Introsort ou introspective sort est un algorithme de tri par comparaisons. C'est une variante du tri rapide inventée par David Musser en 1997. Par rapport au tri rapide, Introsort a l'avantage d'avoir une complexité dans le pire cas.

Principe[modifier | modifier le code]

L'algorithme de tri rapide est 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 en et le temps total en , ce qui est un temps comparable à un tri par sélection. Mais en moyenne, le tri rapide est 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épasse où K est une constante, on trie le sous-tableau restant avec un algorithme dont la complexité est dans tous les cas, par exemple un tri par tas ou un Smoothsort.

Tout comme le tri rapide, Introsort peut être optimisé en triant les sous-listes de moins de 15 éléments avec un tri par insertion ou un tri de Shell, au fur et à mesure, ou à la fin (principe de Sedgesort).

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)

Voir aussi[modifier | modifier le code]

Notes et références[modifier | modifier le code]

  1. (en) David R. Musser, « Introspective Sorting and Selection Algorithms », Software: Practice and Experience, Wiley-Blackwell, vol. 27, no 8,‎ , p. 983-993 (ISSN 1097-024X et 0038-0644, DOI 10.1002/(SICI)1097-024X(200005)30:6<617::AID-SPE311>3.0.CO;2-A)Voir et modifier les données sur Wikidata