Écrire le tri par comptage, qui trie des entiers bornés sans jamais…
Exercice supplémentaire · niveau 3 (difficile) · NSI (première), chapitre 7 — Parcourir, trier, prouver · D'autres tris que les deux du programme
Énoncé
Écrire le tri par comptage, qui trie des entiers bornés sans jamais les comparer. Mesurer son coût, et dire précisément où il cesse d'être avantageux.
Corrigé
def tri_comptage(t, k):
"""Trie un tableau d'entiers de 0 à k-1, sans aucune comparaison.
Précondition : 0 <= x < k pour tout x de t.
Postcondition : le résultat est croissant et a les mêmes effectifs.
"""
c = [0] * k
for x in t:
c[x] = c[x] + 1 # premier parcours : on compte
res = []
for v in range(k):
for _ in range(c[v]): # second parcours : on réécrit
res.append(v)
return res
Validation : tableaux tirés au hasard, avec des bornes variées — cas passent.
Le coût : . Le premier parcours fait opérations ; le second en fait pour balayer le compteur, plus écritures au total. Ni l'un ni l'autre ne compare jamais deux éléments du tableau — c'est ce qui lui permet de descendre sous les lois du tri par comparaison.
| comptage, | sélection, | ||
|---|---|---|---|
Où il cesse d'être avantageux : la ligne du milieu. Trier mille notes sur un million de valeurs possibles coûte plus cher que le tri par sélection, parce qu'il faut allouer et balayer un tableau d'un million de cases dont resteront à zéro. Le tri par comptage paie l'étendue des valeurs, pas leur nombre. Il est excellent pour des notes sur , des âges, des codes postaux ; inutilisable pour des flottants ou des chaînes.
Le prix caché. Il n'est pas en place : il alloue cases de compteur. Les deux tris du cours ne demandent aucune mémoire supplémentaire. C'est un troisième axe de comparaison, après le temps et la stabilité.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.