Skip to content
Snippets Groups Projects
Commit ecba0ab5 authored by Belkacemi Melissa's avatar Belkacemi Melissa
Browse files

tri_sort et analyse_tris2.py

parent e2a1f85b
No related branches found
No related tags found
No related merge requests found
taille;"tri séléction";"tri insertion"
0; 0.00; 0.00
1; 0.00; 0.00
2; 1.00; 1.00
3; 3.00; 2.62
4; 6.00; 4.90
5; 10.00; 7.54
6; 15.00; 10.90
7; 21.00; 14.56
8; 28.00; 19.96
9; 36.00; 23.84
10; 45.00; 29.12
11; 55.00; 35.24
12; 66.00; 42.72
13; 78.00; 48.12
14; 91.00; 55.06
15; 105.00; 64.22
16; 120.00; 72.72
17; 136.00; 82.22
18; 153.00; 91.08
19; 171.00; 100.86
20; 190.00; 109.80
21; 210.00; 116.96
22; 231.00; 136.72
23; 253.00; 142.74
24; 276.00; 154.70
25; 300.00; 172.60
26; 325.00; 185.50
27; 351.00; 197.92
28; 378.00; 213.90
29; 406.00; 228.38
30; 435.00; 242.74
31; 465.00; 264.10
32; 496.00; 273.96
33; 528.00; 297.28
34; 561.00; 308.94
35; 595.00; 328.56
36; 630.00; 347.48
37; 666.00; 369.30
38; 703.00; 386.26
39; 741.00; 417.00
40; 780.00; 429.88
41; 820.00; 438.68
42; 861.00; 476.60
43; 903.00; 490.30
44; 946.00; 514.28
45; 990.00; 535.98
46; 1035.00; 546.88
47; 1081.00; 598.08
48; 1128.00; 605.58
49; 1176.00; 639.08
50; 1225.00; 651.50
51; 1275.00; 689.16
52; 1326.00; 712.04
53; 1378.00; 746.86
54; 1431.00; 768.66
55; 1485.00; 794.12
56; 1540.00; 819.04
57; 1596.00; 854.84
58; 1653.00; 890.52
59; 1711.00; 931.04
60; 1770.00; 951.98
61; 1830.00; 968.66
62; 1891.00; 1008.38
63; 1953.00; 1037.84
64; 2016.00; 1090.42
65; 2080.00; 1080.92
66; 2145.00; 1127.48
67; 2211.00; 1188.08
68; 2278.00; 1207.70
69; 2346.00; 1225.60
70; 2415.00; 1281.40
71; 2485.00; 1313.32
72; 2556.00; 1353.52
73; 2628.00; 1379.60
74; 2701.00; 1422.80
75; 2775.00; 1469.98
76; 2850.00; 1506.84
77; 2926.00; 1535.16
78; 3003.00; 1578.44
79; 3081.00; 1621.58
80; 3160.00; 1655.34
81; 3240.00; 1699.60
82; 3321.00; 1717.26
83; 3403.00; 1794.74
84; 3486.00; 1826.90
85; 3570.00; 1874.66
86; 3655.00; 1931.14
87; 3741.00; 1935.44
88; 3828.00; 2021.40
89; 3916.00; 2035.10
90; 4005.00; 2128.82
91; 4095.00; 2130.34
92; 4186.00; 2177.56
93; 4278.00; 2271.38
94; 4371.00; 2261.42
95; 4465.00; 2299.68
96; 4560.00; 2374.12
97; 4656.00; 2422.98
98; 4753.00; 2486.74
99; 4851.00; 2532.82
100; 4950.00; 2560.18
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
:mod:`analyse_tris` module
:author: FIL - Faculté des Sciences et Technologies - Univ. Lille <http://portail.fil.univ-lille1.fr>_
:date: janvier 2017
:dernières révisions: février 2018, février 2019
Analyse empirique des tris
"""
from random import shuffle
from typing import Callable
from compare import compare
from ap_decorators import count
from tris import *
################################################
# ANALYSE EMPIRIQUE DES TRIS #
################################################
# ajout d'un compteur à la fonction compare
compare = count(compare)
def analyser_tri(tri: Callable[[list[T], Callable[[T, T], int]], NoneType],
nbre_essais: int,
taille: int) -> float:
"""
renvoie: le nombre moyen de comparaisons effectuées par l'algo tri
pour trier des listes de taille t, la moyenne étant calculée
sur n listes aléatoires.
précondition: n > 0, t >= 0, la fonc
"""
res = 0
for i in range(nbre_essais):
compare.counter = 0
l = [k for k in range(taille)]
shuffle(l)
tri(l, compare)
res += compare.counter
return res / nbre_essais
if (__name__ == '__main__'):
from matplotlib import pyplot as plt
# Calcul de nombres moyens de comparaison pour des listes
# de tailles comprises entre 0 et TAILLE_MAX
NB_ESSAIS = 50
TAILLE_MAX = 100
c_select = [0.0] * (TAILLE_MAX + 1)
c_insert = [0.0] * (TAILLE_MAX + 1)
c_sort = [0.0] * (TAILLE_MAX + 1)
for t in range(TAILLE_MAX + 1):
c_select[t] = analyser_tri(tri_select, 1, t)
# inutile de moyenner pour le tri par sélection
c_insert[t] = analyser_tri(tri_insert, NB_ESSAIS, t)
c_sort[t] = analyser_tri(tri_sort, 1, t)
# Sauvegarde des données calculées dans un fichier au format CSV
prem_ligne = 'taille;"tri séléction";"tri insertion"\n'
ligne = '{:3d};{:8.2f};{:8.2f}\n'
with open('analyse_tris.csv', 'wt', encoding='utf8') as sortie:
sortie.write(prem_ligne)
for t in range(TAILLE_MAX + 1):
sortie.write(ligne.format(t,
c_select[t],
c_insert[t],
c_sort))
# Représentation graphique
plt.plot(list(range(TAILLE_MAX + 1)), c_select, 'b.', label='Tri sélection')
plt.plot(list(range(TAILLE_MAX + 1)), c_insert, 'r.', label='Tri insertion')
plt.plot(list(range(TAILLE_MAX + 1)), c_sort, 'g.', label='Tri sort')
plt.title('Tris : nbre de comparaisons')
plt.legend()
plt.xlabel('n = taille des listes')
plt.ylabel('c(n) = nbre de comparaisons')
plt.savefig('tris_nbcomp.png')
plt.show()
# TP7 AP Analyse empirique des tris
# Belkacemi Melissa
# 13/03/2024
#Préliminaires
# l'expression l=[k for k in range(n)] permet de construire en compréhension une liste des entiers de 0 à n-1
from random import shuffle
def liste_alea(n:int)->list[int]:
"""Renvoie une liste de longueur n contenant les entiers de 0 à n-1 mélangés
Précondition : n>=0
Exemple(s) :
$$$ liste_alea(0)
[]
$$$ liste_alea(1)
[0]
"""
l=[k for k in range(n)]
shuffle(l)
return l
#Représentation graphique avec Matplotlib
import matplotlib.pyplot as plt
#Compter les comparaisons
from ap_decorators import count
from compare import compare
nvle_compare = count(compare)
\ No newline at end of file
...@@ -186,6 +186,32 @@ def tri_insert(liste: list[T], comp: Callable[[T, T], int] = compare) -> NoneTyp ...@@ -186,6 +186,32 @@ def tri_insert(liste: list[T], comp: Callable[[T, T], int] = compare) -> NoneTyp
inserer(liste, i, comp=comp) inserer(liste, i, comp=comp)
# alors la tranche liste[0:i+1] est triée # alors la tranche liste[0:i+1] est triée
# à l'issue de l'itération la tranche liste[0:n] est triée # à l'issue de l'itération la tranche liste[0:n] est triée
from functools import cmp_to_key
def tri_sort(liste: list[T], comp: Callable[[T, T], int] = compare) -> NoneType:
"""modifie la liste liste en triant ses éléments selon l'ordre défini par comp en utilisant sort
Précondition :
Exemple(s) :
$$$ liste = [3, 1, 4, 1, 5, 9, 2]
$$$ tri_sort(liste)
$$$ liste == [1, 1, 2, 3, 4, 5, 9]
True
$$$ from random import randrange
$$$ l1 = [randrange(1000) for k in range(randrange(100))]
$$$ l2 = l1.copy()
$$$ tri_sort(l2)
$$$ est_trie(l2)
True
$$$ all(l1.count(elt) == l2.count(elt) for elt in l1)
True
$$$ all(l1.count(elt) == l2.count(elt) for elt in l2)
True
"""
liste.sort(key=cmp_to_key(comp))
if (__name__ == '__main__'): if (__name__ == '__main__'):
......
TP7/analyse-tris/tris_nbcomp.png

29.1 KiB

0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment