Menu
Coddy logo textTech

Quick Sort

Dernière mise à jour

Le tri rapide est un algorithme diviser pour régner qui trie autour d'un « pivot ». Il choisit un élément pivot, puis partitionne le tableau de sorte que tout ce qui est plus petit vienne avant et tout ce qui est plus grand vienne après - ce qui verrouille le pivot dans sa position triée finale. Il applique ensuite la récursion sur les partitions gauche et droite. Cette visualisation utilise le schéma de Lomuto avec le dernier élément comme pivot. Appuyez sur lecture pour voir le partitionnement et le placement du pivot.

Le tri rapide est généralement le tri généraliste le plus rapide en pratique grâce à un bon comportement de cache et au partitionnement en place, avec une moyenne de O(n log n). Son pire cas est O(n²) (par exemple un tableau déjà trié avec un mauvais choix de pivot), que de bonnes stratégies de pivot comme la médiane de trois ou l'aléatoire évitent.

Complexité en temps et en espace

CasComplexitéNotes
Meilleur casO(n log n)Partitions équilibrées
Cas moyenO(n log n)Ordre aléatoire
Pire casO(n²)Pivots systématiquement déséquilibrés
EspaceO(log n)Pile de récursion (partitionnement en place)
StableNonLes échanges du partitionnement réordonnent les éléments égaux

Étape par étape

ÉtapeCe qui se passe
1Choisir un pivot (ici, le dernier élément de la plage).
2Partitionner : déplacer à sa gauche tous les éléments plus petits que le pivot.
3Échanger le pivot vers la frontière - il est maintenant à sa position finale.
4Appliquer récursivement le tri rapide à la partition gauche.
5Appliquer récursivement le tri rapide à la partition droite.

Exemple résolu

Tri de [5, 2, 4, 1] avec le schéma de Lomuto (dernier élément comme pivot) :

PasseTableauAction
Début[5, 2, 4, 1]Partitionner toute la plage ; le pivot est 1 (dernier élément).
1[1, 2, 4, 5]Rien n'est plus petit que 1, on échange donc 1 vers l'indice 0 ; le pivot 1 est maintenant final. Récursion à droite sur [2, 4, 5].
2[1, 2, 4, 5]Partitionner [2, 4, 5] avec le pivot 5 ; 2 et 4 sont tous deux plus petits, donc 5 reste à la fin et est final. Récursion à gauche sur [2, 4].
3[1, 2, 4, 5]Partitionner [2, 4] avec le pivot 4 ; 2 est plus petit, donc 4 reste en place et est final. 2 est un élément unique, il est donc déjà trié.
Terminé[1, 2, 4, 5]Chaque pivot est verrouillé à sa place ; le tableau est trié.

Quand utiliser le tri rapide

À utiliser quandÀ éviter quand
Vous avez besoin d'un tri en mémoire rapide et généraliste avec de petits facteurs constants.Vous avez besoin d'un temps O(n log n) garanti au pire cas (utilisez le tri par tas ou le tri fusion).
La mémoire est limitée - le partitionnement est en place et ne nécessite que O(log n) d'espace de pile.Vous avez besoin d'un tri stable qui préserve l'ordre des clés égales.
Les données sont dans un ordre aléatoire ou inconnu et vous utilisez un pivot aléatoire ou médiane de trois.L'entrée est déjà triée ou presque triée et le pivot est fixe, déclenchant O(n²).
La localité de cache compte, car le tri rapide accède à la mémoire de façon séquentielle.Vous triez une liste chaînée, où le tri fusion évite l'accès aléatoire dont dépend le tri rapide.

Code de Quick Sort

Une implémentation propre et exécutable de Quick Sort en Python, JavaScript, Java, C++, C. Choisissez un langage, copiez le code ou ouvrez-le préchargé dans le Playground Coddy.

Code de Quick Sort en Python

Python
1def quick_sort(a, low=0, high=None):2    if high is None:3        high = len(a) - 14    if low < high:5        p = partition(a, low, high)6        quick_sort(a, low, p - 1)7        quick_sort(a, p + 1, high)8    return a9
10
11def partition(a, low, high):12    # Lomuto partition: everything < pivot moves left of it13    pivot = a[high]14    i = low15    for j in range(low, high):16        if a[j] < pivot:17            a[i], a[j] = a[j], a[i]18            i += 119    a[i], a[high] = a[high], a[i]20    return i21
22
23nums = [10, 7, 8, 9, 1, 5]24print("Before:", nums)25quick_sort(nums)26print("After: ", nums)
Exécutez ce code dans le Playground Python

FAQ sur le tri rapide

Quelle est la complexité temporelle du tri rapide ?
Le tri rapide a une moyenne de O(n log n) et est en O(n log n) dans le meilleur cas, mais se dégrade en O(n²) au pire cas lorsque les partitions sont systématiquement déséquilibrées. Des pivots aléatoires ou médiane de trois rendent le pire cas très improbable.
Le tri rapide est-il stable ?
Non. Le partitionnement standard en place échange des éléments distants, ce qui peut modifier l'ordre relatif des clés égales. Des variantes stables existent mais renoncent à l'avantage du tri rapide de travailler en place.
Pourquoi le tri rapide est-il souvent plus rapide que le tri fusion ?
Le tri rapide partitionne en place avec une excellente localité de cache et sans tampon supplémentaire, donc ses constantes sont petites. Le tri fusion atteint la même borne O(n log n) mais paie un tampon O(n) et davantage de déplacements de données.
Tri rapide ou tri fusion - lequel choisir ?
Choisissez le tri rapide pour trier rapidement et en place des tableaux en mémoire, où ses petites constantes l'emportent généralement. Choisissez le tri fusion lorsque vous avez besoin d'un tri stable, d'un pire cas O(n log n) garanti, ou lorsque vous triez des listes chaînées ou des données externes qui ne tiennent pas en RAM.
Pourquoi le tri rapide devient-il O(n²) sur un tableau trié ?
Avec un pivot fixe comme le premier ou le dernier élément, une entrée déjà triée fait que chaque partition ne sépare qu'un seul élément, produisant n niveaux de récursion au lieu de log n. Choisir le pivot aléatoirement ou avec la médiane de trois brise ce schéma et rétablit le comportement O(n log n).
Quelle est la différence entre les schémas de partitionnement de Lomuto et de Hoare ?
Le schéma de Lomuto utilise un seul indice qui parcourt de gauche à droite et est plus simple à coder, c'est pourquoi cette visualisation l'emploie. Le schéma de Hoare utilise deux pointeurs qui se déplacent vers l'intérieur et effectue généralement moins d'échanges, ce qui le rend plus rapide en pratique, mais il ne place pas le pivot à sa position finale pendant l'étape de partitionnement.
Coddy programming languages illustration

Maîtrisez les algorithmes avec Coddy

COMMENCER