informatique (tronc commun des prépas scientifiques) · Chapitre 3 · Exercice de TD
Le tri à bulles trie-t-il vraiment ? Le test de propriété
Boucles imbriquées et complexité quadratique · niveau 2
Énoncé
Écrire un test de propriété sur 1000 listes aléatoires validant le tri à bulles. Pourquoi est-il fondamental de tester à la fois que la liste finale est triée et qu'elle conserve les mêmes éléments ?
Corrigé
import random
for essai in range(1000):
taille = random.randint(0, 15)
t = [random.randint(-20, 20) for _ in range(taille)]
copie = list(t) # On sauvegarde l'original pour la comparaison
tri_bulles(t)
# 1. Vérification de la croissance
assert all(t[i] <= t[i+1] for i in range(len(t) - 1)), f"Échec de tri : {t}"
# 2. Vérification de la conservation des éléments
assert sorted(copie) == t, f"Perte de données : {copie} -> {t}"
Une erreur classique d'affectation d'échange (comme écrire t[i] = t[i+1] sans sauvegarder t[i]) peut écraser des données. La liste résultante peut être parfaitement croissante (ex. pour une entrée ), mais elle ne contient plus les mêmes éléments. La seconde clause d'assertion est indispensable.