web-dev-qa-db-fra.com

Explication intuitive de la raison pour laquelle QuickSort est n log n?

Est-ce que quelqu'un est capable de donner une explication intuitive, mais formelle, en anglais simple, de ce qui fait QuickSort n log n? D'après ce que j'ai compris, il doit faire un survol de n éléments, et il enregistre ce journal n fois ... Je ne sais pas comment l'exprimer en mots, pourquoi il effectue ce journal n fois.

40
Jim_CS

Chaque opération de partitionnement nécessite O(n) opérations (un seul passage sur le tableau) . En moyenne, chaque partitionnement divise le tableau en deux parties (ce qui correspond à des opérations log n). Au total, nous avons O (n * log n) opérations.

C'est à dire. dans les opérations de partitionnement log n moyennes et chaque partitionnement prend O(n) opérations.

42
Eugene Retunsky

La partie log n vient du fait qu’elle coupe (du moins idéalement) l’entrée de moitié à chaque itération. Commencer à N éléments et les diviser par deux à chaque fois signifie qu'il ne reste plus qu'un élément après le journal2(N) itérations, à quel point vous ne pouvez évidemment plus le subdiviser. Par exemple, à partir de, par exemple, 128 éléments, vous divisez en groupes de 64, 32, 16, 8, 4, 2, 1 éléments - 7 itérations (et enregistrez2(128) = 7).

Chacune de ces itérations parcourt l'ensemble de la matrice pour la partitionner, de sorte que chacune d'entre elles présente une complexité O(N).

Entre les deux, vous vous retrouvez avec des opérations O (log N), chacune ayant une complexité O(n), pour une complexité globale de O (n log n).

Pour être techniquement correct, le Big-O de Quicksort est en fait O (N2) bien que. Cela provient du fait qu'un choix suffisamment mauvais d'éléments de partition pourrait diviser le tableau en un élément d'un côté et le reste du tableau de l'autre. Si cela se produit à chaque itération, il faut N itérations pour le scinder en plusieurs éléments, afin d'obtenir N opérations, chacune avec une complexité de O (N), pour O (N * N) globalement.

Dans une implémentation réelle, vous arrêtez généralement avant cela, mais c'est le plus éloigné possible.

103
Jerry Coffin

Eh bien, ce n’est pas toujours n (log n). C'est le temps de performance lorsque le pivot choisi est approximativement au milieu. Dans le pire des cas, si vous choisissez le plus petit ou le plus grand des éléments comme pivot, le temps sera 0 (n ^ 2).

Pour visualiser 'n log n', vous pouvez supposer que le pivot est l'élément le plus proche de la moyenne de tous les éléments du tableau à trier . Cela diviserait le tableau en 2 parties de même longueur . Sur tous les deux, vous appliquez la procédure de tri rapide.

Comme à chaque étape, vous divisez par deux la longueur du tableau, vous le ferez pour le journal n (base 2) jusqu'à atteindre la longueur = 1, c'est-à-dire un tableau trié d'un élément.

2
Siddharth Gaur

En fait, vous devez trouver la position de tous les N éléments (pivot), mais le nombre maximal de comparaisons est logN pour chaque élément (le premier est N, le deuxième pivot N/2,3 e N/4. l'élément médian)

0
Prdp