This repository has been archived on 2019-08-09. You can view files and clone it, but cannot push or open issues or pull requests.
s1-tp/S2/TP4/analyse_tris.py
Jean-Loup Beaussart (jamesmagnus) 9d00ab1384 tri par insertion, correction tri_et_compte
Note: il y a un truc qui merde dans la fonction de mr Bontoux (ie
tri_selection)
2015-03-11 17:08:09 +01:00

218 lines
4.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
TP AP1
Licence SESI 1ère année
Univ. Lille 1
analyse_tris.py
TP4 - Evaluation empirique des tris
http://www.fil.univ-lille1.fr/~L1S2API/CoursTP/tp4_tri.html
"""
__author__ = 'PREUD\'HOMME Geoffrey & BEAUSSART Jean-loup'
__date_creation__ = 'Tue, 10 Mar 2015 10:26:41 +0100'
from random import randint, shuffle
def partie(nom):
print('\n', nom, '=' * len(nom), sep='\n')
def section(nom):
print('\n', nom, '-' * len(nom), sep='\n')
def question(numero):
print('\n***', 'Question', numero, '***')
partie("Prérequis")
def comp(x, y):
"""
parametres
x , y de même type et comparables
valeur renvoyee : int
-1 si x<y
0 si x==y
1 si x>y
action : incrémente le compteur
CU : aucune
"""
global compteur
compteur = compteur + 1
if x < y:
return -1
elif x == y:
return 0
else:
return 1
def select_min(l, a, b):
"""
list, int, int → int
Renvoie l'indicde d'un élément minimal de la tranche l[a:b]
CU : l est une liste de longueur n, d'éléments homogènes ordonnables, et a et b deux indices tels
que 0 ≤ a < b ≤ n
"""
assert 0 <= a < b <= len(l)
imin = a
for i in range(a + 1, b):
if comp(l[i], imin) == -1:
imin = i
return imin
def tri_selection(l):
"""
list → ∅
La liste l est trié (selon l'algorithme du tri par sélection du minimum)
CU : l est une liste de longueur n, homogène, déléments ordonnables
"""
n = len(l)
for i in range(n - 2):
imin = select_min(l, i, n - 1)
l[i], l[imin] = l[imin], l[i]
def tri_insertion(l, n):
"""
list, int → ∅
n est un indice de l tel que l[0:n] soit une liste triée. La fonction déplace l'élément de rang n de telle sorte que l[0:i+1] soit triée
CU: n est un entier < len(l) et l est une liste, dont les éléments sont comparables, triée jusqu'à l'indice n-1.
"""
assert(type(n)==int and type(l)==list and n < len(l))
aux = l[n]
k=n
while k >= 1 and l[k-1] > aux:
l[k] = l[k-1]
k -= 1
l[k] = aux
partie("Travail à réaliser")
section("Préliminaires")
question(1)
def liste_croissante(n):
"""
int → list(int)
Retourne la liste des entiers compris entre 0 et n-1, rangés dans l'ordre croissant
CU: n est un entier positif
"""
assert(type(n) == int and n >= 0)
return [i for i in range(n)]
question(2)
def liste_decroissante(n):
"""
int → list(int)
Retourne la liste des entiers compris entre 0 et n-1, rangés dans l'ordre décroissant
CU: n est un entier positif
"""
assert(type(n) == int and n >= 0)
return [i for i in range(n - 1, 0, -1)]
question(3)
def liste_alea(n, a, b):
"""
int, int, int → list
Renvoie une liste dentiers, qui construit une liste de longueur n les entiers choisis au hasard
compris entre a et b.
"""
res = []
for i in range(n):
res.append(randint(a, b))
return res
section("Compter les comparaisons")
question(1)
compteur = 0
tri_selection(liste_alea(100, -5000, 5000))
print(compteur, 'comparaisons')
question(2)
def tri_et_compte(foo, l):
"""
Trie la liste l avec la fonction de triage foo passée en paramètre, renvoie la liste triée et le nombre de comparaisons effectuées
str, list → (list, int)
CU: l est une liste
"""
assert(type(l) == list)
global compteur
compteur = 0
foo(l)
return (l, compteur)
partie("Analyse du tri par sélection")
question(1)
for i in range(1, 101):
print(i, " ", tri_et_compte(tri_selection, liste_croissante(i+1))[1], " ", tri_et_compte(
tri_selection, liste_alea(i+1, 0, 500))[1], " ", tri_et_compte(tri_selection, liste_decroissante(i+1))[1])
question(2)
partie("Analyse du tri par insertion")
question(1)
section("Dans le meilleur des cas")
question(1)
question(2)
section("Dans le pire des cas")
question(1)
question(2)
section("En moyenne")
question(1)
question(2)
question(3)
question(4)
question(5)
section("Avec Gnuplot")
question(1)