Tris et complexité
Parcours séquentiel d'un tableau et coût linéaire, tri par sélection et tri par insertion, invariant de boucle et terminaison, coût quadratique, comparaison expérimentale des durées.
1. Parcours séquentiel
Propriété · Coût linéaire
Rechercher une valeur, calculer une somme, un maximum ou une moyenne nécessite de parcourir tout le tableau : pour $n$ éléments, environ $n$ opérations. On dit que le coût (la complexité) est linéaire, en $O(n)$.
2. Tri par sélection
Méthode · Principe
Pour chaque position $i$, on cherche le plus petit élément de la partie non triée (indices $i$ à $n - 1$) et on l'échange avec l'élément d'indice $i$.
def tri_selection(t):
n = len(t)
for i in range(n - 1):
imin = i
for j in range(i + 1, n):
if t[j] < t[imin]:
imin = j
t[i], t[imin] = t[imin], t[i]3. Tri par insertion
Méthode · Principe
def tri_insertion(t):
for i in range(1, len(t)):
x = t[i]
j = i
while j > 0 and t[j - 1] > x:
t[j] = t[j - 1]
j = j - 1
t[j] = x4. Correction et coût
Définition · Invariant et terminaison
Un invariant de boucle est une propriété vraie avant et après chaque tour : pour les deux tris, « après le tour $i$, les éléments d'indices $0$ à $i$ sont triés ». Il prouve la correction. La terminaison est assurée par un variant : une quantité entière positive qui décroît strictement (par exemple $j$ dans la boucle while).
Propriété · Coût quadratique
Dans le pire cas, ces tris effectuent environ $\dfrac{n^2}{2}$ comparaisons : coût quadratique, en $O(n^2)$. Doubler la taille du tableau multiplie la durée par environ $4$. Le tri par insertion est rapide sur un tableau presque trié. La fonction sorted de Python est bien plus efficace (en $O(n \log n)$).
Activité · Mesurer les durées
time.S'entraîner
Exercices corrigés
🎓 20 exercices corrigés et un quiz vous attendent dans ce chapitre.
Créez votre compte gratuit pour voir les corrections, faire les quiz et suivre votre progression.
Coût d'une recherche
★☆☆Combien de comparaisons au maximum pour chercher une valeur dans un tableau non trié de $1\,000$ éléments ?
Dérouler le tri par sélection
★★☆Donner l'état de [4, 1, 3, 2] après chaque tour du tri par sélection.
Dérouler le tri par insertion
★★☆Donner l'état de [4, 1, 3, 2] après chaque tour du tri par insertion.
Figure du cours
★☆☆Dans la figure du tri par insertion, quel élément est inséré à l'étape 3 ? à quelle place ?
Nombre de comparaisons
★★☆Combien de comparaisons fait le tri par sélection sur $5$ éléments ?
Formule générale
★★★Montrer que le tri par sélection fait $\dfrac{n(n - 1)}{2}$ comparaisons.
Doubler la taille
★★☆Un tri quadratique trie $10\,000$ éléments en $2$ s. Durée estimée pour $20\,000$ ? $100\,000$ ?
Meilleur cas
★★☆Combien de décalages fait le tri par insertion sur un tableau déjà trié ?
Pire cas
★★☆Quel tableau de taille $4$ est le pire cas du tri par insertion ?
Invariant
★★☆Énoncer l'invariant du tri par sélection.
Terminaison
★★☆Pourquoi la boucle while du tri par insertion se termine-t-elle ?
Ordre décroissant
★★☆Que changer dans le tri par sélection pour trier en ordre décroissant ?
Tri en place
★★☆Les fonctions du cours renvoient-elles un nouveau tableau ?
Vérifier un tri
★★☆Écrire une fonction est_trie(t).
Échange
★☆☆Que fait t[i], t[k] = t[k], t[i] ?
Comparer avec sorted
★★☆Pourquoi utiliser sorted en pratique ?
Mesurer
★★☆Comment mesurer la durée d'exécution d'un tri en Python ?
Moyenne et coût
★☆☆Quel est le coût du calcul de la moyenne d'un tableau de $n$ nombres ?
Tri de chaînes
★★☆Que donne le tri de ["poire", "Abricot", "banane"] ? Pourquoi ?
Vrai ou faux
★★☆a) Le tri par sélection est quadratique. b) Doubler $n$ double la durée d'un tri quadratique. c) Un invariant permet de prouver la correction.
Vérifier
Avez-vous bien compris ?
Répondez au quiz : la correction s'affiche immédiatement.