Menu
Coddy logo textTech

Counting Sort

Dernière mise à jour

Le tri par comptage est un tri sans comparaison pour des entiers dans une plage connue et limitée. Il compte combien de fois chaque valeur apparaît, puis utilise ces comptes pour écrire chaque valeur directement à sa position triée - sans aucune comparaison. Appuyez sur lecture ci-dessus pour voir les valeurs être comptées puis replacées dans l'ordre.

Le tri par comptage s'exécute en temps O(n + k), où k est la plage des valeurs d'entrée. Lorsque k n'est pas beaucoup plus grand que n, il est extrêmement rapide et peut surpasser les tris par comparaison en O(n log n), mais si la plage de valeurs est énorme, le tableau de comptage en O(k) le rend impraticable.

Complexité en temps et en espace

CasComplexitéNotes
TempsO(n + k)n éléments, k = plage de valeurs
EspaceO(n + k)Tableau de comptage + tableau de sortie
StableOuiLorsqu'on place de droite à gauche à l'aide de sommes préfixes
Comparaison ?NonTrie par comptage, pas par comparaison
Idéal pourPetite plage d'entiersk proche de n

Étape par étape

ÉtapeCe qui se passe
1Trouver la valeur maximale pour dimensionner le tableau de comptage.
2Compter combien de fois chaque valeur apparaît.
3(Optionnel) Convertir les comptes en sommes préfixes pour la stabilité.
4Écrire chaque valeur dans la sortie autant de fois qu'elle apparaît.
5Le tableau de sortie est désormais entièrement trié.

Exemple détaillé

Tri de [1, 4, 1, 2, 4] (les valeurs vont de 0 à 4, le tableau de comptage a donc 5 cases) :

PasseÉtatAction
Parcourir l'entréecount = [0, 2, 1, 0, 2]Compter les occurrences : 1 apparaît deux fois, 2 une fois, 4 deux fois.
Sommes préfixescount = [0, 2, 3, 3, 5]Chaque case contient désormais combien de valeurs sont <= à son indice, donnant les positions finales.
Placer 4output = [_, _, _, _, 4]Lire de droite à gauche : count[4] = 5, donc 4 va à l'indice 4 ; décrémenter à 4.
Placer 2output = [_, _, 2, _, 4]count[2] = 3, donc 2 va à l'indice 2 ; décrémenter à 2.
Placer 1output = [_, 1, 2, _, 4]count[1] = 2, donc 1 va à l'indice 1 ; décrémenter à 1.
Placer 4output = [_, 1, 2, 4, 4]count[4] = 4, donc ce 4 va à l'indice 3 ; décrémenter à 3.
Placer 1output = [1, 1, 2, 4, 4]count[1] = 1, donc ce 1 va à l'indice 0. Le tableau est trié.

Quand utiliser le tri par comptage

À utiliser quandÀ éviter quand
Vous triez des entiers (ou des clés convertibles en entiers) dans une petite plage connue.La plage de valeurs k est bien plus grande que le nombre d'éléments n.
Vous avez besoin d'un temps linéaire O(n + k) et pouvez vous permettre les tableaux supplémentaires.La mémoire est limitée - le tableau de comptage coûte O(k) quel que soit n.
Vous avez besoin d'un tri stable comme sous-routine (par exemple, à l'intérieur du radix sort).Les clés sont des flottants, des chaînes ou des objets arbitraires sans conversion en entiers.
La valeur maximale est bornée et peu coûteuse à calculer à l'avance.La plage est inconnue ou non bornée, si bien que vous ne pouvez pas dimensionner le tableau de comptage.

Code de Counting Sort

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

Code de Counting Sort en Python

Python
1def counting_sort(a):2    # Works for non-negative integers with a small max value3    counts = [0] * (max(a) + 1)4    for value in a:5        counts[value] += 16    # Prefix sums turn counts into final positions7    for i in range(1, len(counts)):8        counts[i] += counts[i - 1]9    out = [0] * len(a)10    for value in reversed(a):  # reversed keeps equal values stable11        counts[value] -= 112        out[counts[value]] = value13    return out14
15
16nums = [4, 2, 2, 8, 3, 3, 1]17print("Before:", nums)18print("After: ", counting_sort(nums))
Exécutez ce code dans le Playground Python

FAQ sur le tri par comptage

Quelle est la complexité temporelle du tri par comptage ?
Le tri par comptage est en O(n + k), où n est le nombre d'éléments et k la plage des valeurs possibles. Lorsque k = O(n), c'est un temps linéaire. Il utilise O(n + k) d'espace supplémentaire.
Le tri par comptage est-il stable ?
Il peut l'être. La version stable construit les sommes préfixes des comptes et place les éléments de droite à gauche, ce qui préserve l'ordre relatif des clés égales. La version simple « réécriture par valeur » montrée ici produit un tri correct mais est surtout utilisée pour des entiers simples.
Quand devrais-je utiliser le tri par comptage ?
Utilisez-le pour trier des entiers (ou des clés convertibles en entiers) dans une plage petite et connue. Si la plage de valeurs k est bien plus grande que le nombre d'éléments, le tableau de comptage gaspille de la mémoire et un tri par comparaison est préférable.
Quelle est la différence entre le tri par comptage et le tri par base (radix sort) ?
Le tri par comptage trie sur la valeur entière en une seule passe et nécessite un tableau de comptage aussi grand que la plage de valeurs. Le tri par base trie chiffre par chiffre et appelle généralement un tri par comptage stable sur chaque chiffre, ce qui maintient une petite plage par passe (par exemple 10 pour les chiffres décimaux). Le tri par base gère de grandes plages de valeurs qui rendraient un seul tri par comptage impraticable.
Pourquoi le tri par comptage n'est-il pas toujours plus rapide que le tri rapide (quicksort) ?
Le tri par comptage est en O(n + k), il ne gagne donc que lorsque la plage de valeurs k est comparable à n. Si k est énorme - par exemple trier 100 valeurs dans la plage de 0 à 1,000,000,000 - le tableau de comptage en O(k) domine et gaspille de la mémoire, tandis qu'un tri par comparaison en O(n log n) comme le quicksort reste rapide et économe en espace.
Le tri par comptage peut-il gérer les nombres négatifs ?
Oui, avec un petit décalage. Au lieu d'indexer le tableau de comptage directement par la valeur, indexez-le par value - min, de sorte que la plus petite valeur corresponde à l'indice 0. La taille du tableau de comptage devient max - min + 1. Oublier ce décalage est une erreur courante qui plante sur des entrées négatives.
Coddy programming languages illustration

Maîtrisez les algorithmes avec Coddy

COMMENCER