#!/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 xy 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] 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 d’entiers, 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 question(2) def tri_et_compte(foo, l): assert(type(l) == list) global compteur compteur = 0 return (foo(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], " ", tri_et_compte( tri_selection, liste_decroissante(i))[1], " ", tri_et_compte(tri_selection, liste_alea(i, 0, 500))[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)