web-dev-qa-db-fra.com

Tri rapide avec partition à 3 voies

Qu'est-ce que QuickSort avec une partition à 3 voies?

35
CodeMonkey1313

Imaginez un tableau:

3, 5, 2, 7, 6, 4, 2, 8, 8, 9, 0

Un Tri rapide à deux partitions choisirait une valeur, disons 4, et mettrait chaque élément supérieur à 4 d'un côté du tableau et chaque élément inférieur à 4 de l'autre côté. Ainsi:

3, 2, 0, 2, 4, | 8, 7, 8, 9, 6, 5

Un tri rapide sur trois partitions choisirait deux valeurs sur lesquelles partitionner et diviserait le tableau de cette façon. Permet de choisir 4 et 7:

3, 2, 0, 2, | 4, 6, 5, 7, | 8, 8, 9

Il s'agit simplement d'une légère variation du tri rapide standard.

Vous continuez de partitionner chaque partition jusqu'à ce que la baie soit triée. Le runtime est techniquement nlog3(n) qui varie très légèrement du journal de bord de quicksort habituel2(n).

52
jjnguy

http://www.sorting-algorithms.com/static/QuicksortIsOptimal.pdf

Voir également:

http://www.sorting-algorithms.com/quick-sort-3-way

Je pensais que la version des questions d'entrevue était également intéressante. Il demande, existe-t-il quatre versions de partition de quicksort ...

16
cgp

Je pense que la partition à 3 voies est par Djstrka.

Pensez à un tableau avec des éléments { 3, 9, 4, 1, 2, 3, 15, 17, 25, 17 }.

Fondamentalement, vous configurez 3 partitions: inférieure à, égale à et supérieure à un certain pivot. La partition égale à n'a pas besoin d'être triée davantage car tous ses éléments sont déjà égaux.


Par exemple, si nous choisissons le premier 3 comme pivot, une partition à 3 voies utilisant Dijkstra organiserait le tableau d'origine et renverrait deux indices m1 et m2 tel que tous les éléments dont l'indice est inférieur à m1 sera inférieur à 3, tous les éléments dont l'indice est supérieur ou égal à m1 et inférieur ou égal à m2 sera égal à 3, et tous les éléments dont l'index est supérieur à m2 sera plus grand que 3.

Dans ce cas particulier, le tableau résultant pourrait être { 1, 2, 3, 3, 9, 4, 15, 17, 25, 17 }, et les valeurs m1 et m2 serait m1 = 2 et m2 = 3.

Notez que le tableau résultant peut changer en fonction de la stratégie utilisée pour partitionner, mais les nombres m1 et m2 serait le même.

13
runners3431

si vous broyez vraiment les mathématiques en utilisant formule Akra-Bazzi en laissant le nombre de partitions en tant que paramètre, puis en optimisant ce paramètre, vous constaterez que les partitions e (= 2,718 ...) donnent la performance la plus rapide. dans la pratique, cependant, nos constructions de langage, cpus, etc. sont toutes optimisées pour les opérations binaires, de sorte que le partitionnement standard en deux ensembles sera le plus rapide.

12
Autoplectic

Je pense que cela est lié à la façon de partitionner Dijkstra où la partition est composée d'éléments plus petits, égaux et plus grands que le pivot. Seules les partitions plus petites et plus grandes doivent être triées récursivement. Vous pouvez voir une visualisation interactive et jouer avec elle sur le noyer . Les couleurs que j'ai utilisées sont rouge/blanc/bleu car la méthode de partitionnement est généralement appelée "le problème du drapeau hollandais"

1
Daniel F. Moisset

Le tri rapide à 3 voies partitionne essentiellement le tableau en 3 parties. La première partie est inférieure au pivot, la deuxième partie est égale à pivot et la troisième partie est supérieure à pivot. Il s'agit d'un algorithme de partition linéaire. Cette partition est similaire au problème du drapeau national néerlandais.

0
Vartika Sharma