Je n'ai jamais vu de tri rapide à double pivot auparavant. S'il s'agit d'une édition de mise à niveau de tri rapide?
Et quelle est la différence entre le tri rapide à double pivot et le tri rapide?
Je trouve cela dans le Java doc.
L'algorithme de tri est un tri rapide à double pivot de Vladimir Yaroslavskiy, Jon Bentley et Joshua Bloch. Cet algorithme offre des performances O (n log (n)) sur de nombreux ensembles de données qui provoquent une dégradation des autres tri rapides en performances quadratiques et est généralement plus rapide que les implémentations Quicksort traditionnelles (un pivot).
Ensuite, je trouve cela dans le résultat de recherche Google. Thoery d'algorithme de tri rapide:
- Choisissez un élément, appelé pivot, dans le tableau.
- Réorganisez le tableau de sorte que tous les éléments, qui sont inférieurs au pivot, viennent avant le pivot et que tous les éléments supérieurs au pivot viennent après (les valeurs égales peuvent aller dans les deux sens). Après ce cloisonnement, l'élément pivot est dans sa position finale.
- Trier récursivement le sous-tableau des éléments inférieurs et le sous-tableau des éléments supérieurs.
En comparaison, tri rapide à double pivot:
()
- Pour les petits tableaux (longueur <17), utilisez l'algorithme de tri par insertion.
- Choisissez deux éléments pivotants P1 et P2. Nous pouvons obtenir, par exemple, le premier élément a [gauche] comme P1 et le dernier élément a [droite] comme P2.
- P1 doit être inférieur à P2, sinon ils sont échangés. Donc, il y a les parties suivantes:
- partie I avec des indices de gauche + 1 à L – 1 avec des éléments inférieurs à P1,
- partie II avec des indices de L à K – 1 avec des éléments supérieurs ou égaux à P1 et inférieurs ou égaux à P2,
- la partie III avec des indices de G + 1 à droite – 1 avec des éléments supérieurs à P2,
- la partie IV contient le reste des éléments à examiner avec des indices de K à G.
- L'élément suivant a [K] de la partie IV est comparé à deux pivots P1 et P2 et placé dans la partie correspondante I, II ou III.
- Les pointeurs L, K et G sont modifiés dans les directions correspondantes.
- Les étapes 4 à 5 sont répétées avec K ≤ G.
- L'élément pivot P1 est échangé avec le dernier élément de la partie I, l'élément pivot P2 est échangé avec le premier élément de la partie III.
- Les étapes 1 à 7 sont répétées de manière récursive pour chaque partie I, partie II et partie III.
Pour ceux qui sont intéressés, regardez comment ils ont implémenté cet algorithme en Java:
Comme indiqué dans la source:
"Trie la plage spécifiée du tableau en utilisant la tranche de tableau d'espace de travail donnée si possible pour la fusion
"L'algorithme offre des performances O (n log (n)) sur de nombreux ensembles de données qui provoquent la dégradation d'autres performances en performances quadratiques et est généralement plus rapide que les implémentations Quicksort traditionnelles (un pivot)".
Je veux juste ajouter que du point de vue de l'algorithme (c'est-à-dire que le coût ne prend en compte que le nombre de comparaisons et d'échanges), le tri rapide à 2 pivots et le tri rapide à 3 pivots ne sont pas meilleurs que le tri rapide classique (qui utilise 1 pivot), sinon pire. Cependant, ils sont plus rapides dans la pratique car ils profitent des avantages de l'architecture informatique moderne. Plus précisément, leur nombre d'échecs de cache est plus petit. Donc, si nous supprimons tous les caches et qu'il n'y a que le processeur et la mémoire principale, à ma connaissance, le tri rapide à 2/3 pivots est pire que le tri rapide classique.
Références: Quicksort 3 pivots: https://epubs.siam.org/doi/pdf/10.1137/1.9781611973198.6 Analyse des raisons pour lesquelles ils fonctionnent mieux que Quicksort classique: https://arxiv.org/pdf/1412.0193v1.pdf Une référence complète et pas trop détaillée: https://algs4.cs.princeton.edu/lectures/23Quicksort.pdf