HLPH609 Programmation pour la physique , Faculte des Sciences de Montpellier, 2016 Travaux pratiques 5 : Les algorithmes de tri Exercice 5.1 : Analyse de la complexite La fonction suivante teste si un nombre n est premier par des essais successives de division. Examiner le code, comprendre comment il fonctionne, et analyser la complexite de cette methode dans le pire cas. def est_premier (n): k = 2 while k **2 <= n: if n % k == 0: return False k += 1 return True Exercice 5.2 : Tri rapide (a) Derouler a la main l'algorithme du tri rapide sur le tableau [15, 4, 2, 8, 23, 17, 0, 11]. (b) Realiser les fonctions echange(li, i, j), partition(li, l, r) et tri_rapide(li, l, r) decrites en cours. (c) Appliquer votre implementation du tri rapide au tableau ci-dessus. (d) Montrer que la complexite du tri rapide dans le pire cas (pivot = premier element, liste deja triee) est quadratique. (e) Modier votre code de la sorte que le pivot est choisi par hasard, en utilisant la fonction random.randrange(). Exercice 5.3 : Tri fusion Derouler a la main l'algorithme de tri fusion sur le tableau [15, 4, 2, 8, 23, 17, 0, 11]. Exercice 5.4 : La complexite des algorithmes de tri (a) La complexite du tri fusion est O(n log n) en tous cas. Assurez-vous de la dierence entre les algorithmes O(n2 ) et O(n log n) : Generez des listes de 1 000, 10 000 et 100 000 entiers aleatoires et triez-les (sans rien acher) avec le tri fusion ou avec le tri rapide. Puis, essayez de faire pareil avec le tri par insertion. (b) Un algorithme de tri qui n'est pas applique en pratique, pour des raisons evidentes, est le bogosort (\tri stupide") : Aleatoirement rearranger tous les elements, puis verier s'ils sont par hasard dans la bonne ordre, et sinon, repeter. Determiner la complexite en moyenne du tri stupide.