93 lines
3.1 KiB
Python
93 lines
3.1 KiB
Python
# Projet 08 — La Course des Algorithmes
|
|
# Comparer les performances du tri par insertion et du tri par sélection
|
|
|
|
import random
|
|
import time
|
|
|
|
# -------------------------------------------------------
|
|
# Étape 1 : recopie ici tes deux fonctions de tri
|
|
# -------------------------------------------------------
|
|
|
|
def tri_insertion(tab):
|
|
# TODO : recopier depuis le cours
|
|
pass
|
|
|
|
def tri_selection(tab):
|
|
# TODO : recopier depuis le cours
|
|
pass
|
|
|
|
# -------------------------------------------------------
|
|
# Outils de mesure (déjà fournis)
|
|
# -------------------------------------------------------
|
|
|
|
def mesurer_temps(fonction, tab):
|
|
"""
|
|
Mesure le temps d'exécution de fonction(tab) en millisecondes.
|
|
Travaille sur une copie pour ne pas modifier l'original.
|
|
"""
|
|
copie = tab[:]
|
|
debut = time.time()
|
|
fonction(copie)
|
|
fin = time.time()
|
|
return round((fin - debut) * 1000, 3) # résultat en ms
|
|
|
|
def generer_liste(n, mode="aleatoire"):
|
|
"""
|
|
Génère une liste de n entiers selon le mode :
|
|
- "aleatoire" : ordre aléatoire
|
|
- "trie" : déjà triée (croissant)
|
|
- "inverse" : triée à l'envers (décroissant)
|
|
"""
|
|
if mode == "aleatoire":
|
|
return random.sample(range(n * 10), n)
|
|
elif mode == "trie":
|
|
return list(range(n))
|
|
elif mode == "inverse":
|
|
return list(range(n, 0, -1))
|
|
|
|
# -------------------------------------------------------
|
|
# Étape 3 : tableau comparatif selon la taille
|
|
# -------------------------------------------------------
|
|
|
|
def comparer_tailles():
|
|
tailles = [100, 500, 1000, 2000, 5000]
|
|
print("=== Comparaison par taille (liste aléatoire) ===\n")
|
|
print(f" {'n':>6} {'Insertion (ms)':>16} {'Sélection (ms)':>16} {'Vainqueur':>10}")
|
|
print(" " + "-" * 55)
|
|
|
|
for n in tailles:
|
|
liste = generer_liste(n, "aleatoire")
|
|
t_insertion = mesurer_temps(tri_insertion, liste)
|
|
t_selection = mesurer_temps(tri_selection, liste)
|
|
vainqueur = "Insertion" if t_insertion < t_selection else "Sélection"
|
|
print(f" {n:>6} {t_insertion:>16.3f} {t_selection:>16.3f} {vainqueur:>10}")
|
|
print()
|
|
|
|
# -------------------------------------------------------
|
|
# Étape 4 : tableau comparatif selon le mode (n fixé)
|
|
# -------------------------------------------------------
|
|
|
|
def comparer_modes(n=1000):
|
|
modes = ["aleatoire", "trie", "inverse"]
|
|
print(f"=== Comparaison par configuration (n = {n}) ===\n")
|
|
print(f" {'Mode':<12} {'Insertion (ms)':>16} {'Sélection (ms)':>16} {'Vainqueur':>10}")
|
|
print(" " + "-" * 60)
|
|
|
|
for mode in modes:
|
|
liste = generer_liste(n, mode)
|
|
t_insertion = mesurer_temps(tri_insertion, liste)
|
|
t_selection = mesurer_temps(tri_selection, liste)
|
|
vainqueur = "Insertion" if t_insertion < t_selection else "Sélection"
|
|
print(f" {mode:<12} {t_insertion:>16.3f} {t_selection:>16.3f} {vainqueur:>10}")
|
|
print()
|
|
|
|
# -------------------------------------------------------
|
|
# Programme principal
|
|
# -------------------------------------------------------
|
|
|
|
comparer_tailles()
|
|
comparer_modes(n=1000)
|
|
|
|
print("Conclusion :")
|
|
print(" TODO : écris tes observations ici")
|