Tri par file de priorité
Un tri par file de priorité[1] est un algorithme de tri utilisant comme support principal une implémentation du type abstrait file de priorité.
Si l'exemple classique de tri par file de priorité est le tri par tas, on peut aussi classifier d'autres tris usuels comme tri par file de priorité comme le tri par insertion, le tri par sélection ou encore le tri rapide.
Principe
Une fois que l'on dispose d'une file de priorité, on dispose alors des opérations enfiler
, défiler
et est_vide
[2].
Pour trier une collection d'éléments, on va alors itérer une première fois la collection des éléments à trier pour les enfiler
dans la file de priorité. Ensuite, tant que la file de priorité n'est pas vide (avec est_vide
) on peut en défiler
les éléments dans l'ordre triés.
Pseudo-code
Entrée = Un ensemble d'éléments E muni d'un ordre total < Sortie = Une liste d'éléments triés selon < |
fonction tri_file_priorité (E) : P une file de priorité initialement vide L une liste initialement vide tant que E non vide : e <- retirer élément de E enfiler e dans P tant que P non vide : e <- défiler P ajoute e à L renvoyer L |
Représentation des tris classiques
nom de l'algo | implémentation de la file de priorité | meilleur cas | cas moyen | pire cas |
---|---|---|---|---|
Smoothsort | Tas de Léonard | |||
Tri par tas | Tas | |||
Tri arborescent | ABR équilibré | |||
Tri rapide | ABR | |||
Tri par insertion | Tableau trié | |||
Tri par sélection | Tableau non trié |
Tri par tas
Si la file de priorité est implémentée par un tas, le tri par file de priorité associée revient au tri par tas par définition de celui-ci[3].
Tri par insertion
Si la file de priorité est implémentée par une liste triée, le tri par file de priorité associée revient au tri par insertion[1].
En effet, enfiler
un élément revient à une opération d'insertion du tri par insertion. La seconde boucle pour defiler
n'est pas nécessaire comme l'on peut renvoyer la file de priorité elle-même qui est la liste triée.
Tri par sélection
Si la file de priorité est implémentée par une liste quelconque, le tri par file de priorité associée revient au tri par sélection[1].
En effet, la file de priorité est la liste d'élément elle-même. La première boucle pour enfiler
les éléments n'est pas nécessaire. La seconde, qui consister à défiler
les éléments un par un, reviens à l'opération de sélection des éléments du tri par sélection.
Tri rapide
Si la file de priorité est implémentée par un arbre binaire de recherche, le tri par file de priorité associée revient au tri rapide.
En effet, les différents nœuds de l'arbre binaire de recherche sont les pivots du tri rapide.
Utilisation d'un tri pour faire une file de priorité
Si l'implémentation d'un tri à partir d'une file de priorité est assez immédiat, la réciproque est moins intuitive.
Pourtant, on peut déduire de l'existence d'algorithmes de tri l'existence d'une file de priorité associée. En effet, d'après Mikkel Thorup[2] :
Si l'on peut trier clef en temps par clef alors, il existe une file de priorité avec une complexité d'enfiler et de défiler en .
Notes et références
- « FILES A PRIORITÉ »
[PDF] (consulté le )
- Mikkel Thorup, « Equivalence between priority queues and sorting », J. ACM, vol. 54, no 6, , p. 28–es (ISSN 0004-5411, DOI 10.1145/1314690.1314692, lire en ligne, consulté le )
- ↑ François Schwarzentruber, « Files de priorité et Tas Binaires »
[PDF], (consulté le )