Dimension pédagogique
En raison de sa simplicité, la méthode de partitionnement de Lomuto pourrait être plus facile à mettre en œuvre. Il y a une belle anecdote dans la Programmation de Jon Bentley sur le tri:
«La plupart des discussions sur Quicksort utilisent un schéma de partitionnement basé sur deux indices qui s'approchent [...] [c'est-à-dire ceux de Hoare]. Bien que l'idée de base de ce schéma soit simple, j'ai toujours trouvé les détails délicats - j'ai déjà passé une bonne partie des deux jours à chasser un bogue caché dans une courte boucle de partitionnement. Un lecteur d'un avant-projet s'est plaint de ce que la méthode standard à deux index est en réalité plus simple que celle de Lomuto et a esquissé du code pour faire valoir son point; J'ai arrêté de chercher, j'ai trouvé deux insectes.
Dimension de performance
Pour une utilisation pratique, la facilité de mise en œuvre pourrait être sacrifiée pour des raisons d'efficacité. Sur une base théorique, nous pouvons déterminer le nombre de comparaisons d’éléments et d’échanges pour comparer les performances. De plus, le temps d'exécution réel sera influencé par d'autres facteurs, tels que les performances de la mise en cache et les prédictions erronées des branches.
Comme indiqué ci-dessous, les algorithmes se comportent de manière très similaire sur les permutations aléatoires, à l' exception du nombre de swaps . Là-bas, Lomuto a besoin de trois fois plus que Hoare!
Nombre de comparaisons
n−1n
Nombre de swaps
Le nombre de swaps est aléatoire pour les deux algorithmes, en fonction des éléments du tableau. Si nous supposons des permutations aléatoires , c'est-à-dire que tous les éléments sont distincts et que chaque permutation des éléments est également probable, nous pouvons analyser le nombre attendu de swaps.
1,…,n
Méthode de Lomuto
jA[j]x1,…,nx−1xx−1x
{1,…,n}1n
1n∑x=1n(x−1)=n2−12.
n
Méthode de Hoare
x
ijxij
x
Hyp(n−1,n−x,x−1)n−xx−1(n−x)(x−1)/(n−1)x
Enfin, nous effectuons une nouvelle moyenne sur toutes les valeurs de pivot pour obtenir le nombre total de swaps attendus pour le partitionnement de Hoare:
1n∑x=1n(n−x)(x−1)n−1=n6−13.
(Une description plus détaillée se trouve dans la thèse de ma maîtrise , page 29.)
Motif d'accès mémoire
Les deux algorithmes utilisent deux pointeurs dans la matrice qui l’analysent séquentiellement . Par conséquent, les deux se comportent de manière presque optimale en ce qui concerne la mise en cache.
Eléments identiques et listes déjà triées
Comme déjà mentionné par Wandering Logic, les performances des algorithmes diffèrent plus radicalement pour les listes qui ne sont pas des permutations aléatoires.
n/2
0ijO(nlogn)
0A[j] <= x
i=nΘ(n2)
Conclusion
La méthode de Lomuto est simple et facile à mettre en œuvre, mais ne devrait pas être utilisée pour mettre en œuvre une méthode de tri de bibliothèque.
A[i+1] <= x
. Dans un tableau trié (et avec des pivots raisonnablement choisis), Hoare n'échange presque pas et Lomuto en fait une tonne (une fois que j est devenu assez petit, puis tout leA[j] <= x
.) Que me manque-t-il?