Aller au contenu

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

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.

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).

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)

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,no8,‎,p.983-993(ISSN1097-024Xet0038-0644,DOI10.1002/(SICI)1097-024X(200005)30:6<617::AID-SPE311>3.0.CO;2-A).Voir et modifier les données sur Wikidata