• Aucun résultat trouvé

1.Introduction au tri à bulles

N/A
N/A
Protected

Academic year: 2022

Partager "1.Introduction au tri à bulles"

Copied!
4
0
0

Texte intégral

(1)

IUT ORSAY Page 1 2014-2015

Mesures physiques Semestre S'1

Partiel d'Informatique Scientifique Tri à Bulles

Tout document papier ou électronique local autorisé (s'ils sont sur votre clé USB, vous devez les copier en début de séance puis retirer votre clé pour la suite du partiel).

Documents (cours, poly TP, docs…) disponibles sur la machine de TP.

Vous devez créer un répertoire de partiel SP1A1_Nom_Prenom1 sur le “bureau” de l'ordina- teur, il devra contenir les fichiers modules Python que vous écrirez. Les modules devront compor- ter les en-têtes habituels, le code devra être documenté/commenté pertinemment2 et testé (valeurs directement dans le code de test, pas de input !!! , si besoin utilisez des boucles pour tester plusieurs valeurs intéressantes), les résultats d'exécution des tests doivent être copiés/collés dans une chaîne

"""…triple quote…""" à la fin des modules.

Lorsque vous avez terminé ou que le temps imparti est fini, vous devez recopier ce répertoire

S1B2_Nom_Prenom dans le répertoire srva018/FichiersEtudiants/ et attendre que l'ensei- gnant vous confirme qu'il a bien été recopié !!!

La notation tiendra compte du respect strict des consignes sur le travail demandé, de la qualité des chaînes de documentation et des commentaires, de la pertinence des tests et de leur affichage recopié à la fin des modules Python.

Si vous n’arrivez pas à coder l’algorithme d’une fonction, essayez de faire qu’elle simule au moins un fonctionnement (retour d'une valeur de bon type mais bidon…), et passez à la suite. Si une ligne vous pose définitivement un problème, laissez-la en commentaire afin de pouvoir pour- suivre sur le reste du partiel en pouvant exécuter le script – ajoutez un commentaire expliquant ce que vous vouliez faire et vos éventuels problèmes.

Sauf directive explicite , lorsque vous avez besoin d'un service déjà rendu par une fonction, vous êtes censé appeler cette fonction et utiliser le résultat retourné – et pas dupliquer son code.

1. Introduction au tri à bulles

Parmi les algorithmes de tri existe celui appelé « tri à bulles » (ou bubble-sort), particulièrement inefficace, mais assez facile à comprendre.

Le nom « tri à bulles » s'inspire de ce qui se passe lorsque des éléments sont insérés dans un milieu aqueux !!!s suivant le principe de la poussée d'Archimède, les plus légers que l'eau (par exemple les bulles) remontent tandis que les plus lourds (par exemple des graviers) coulent.

Nous allons utiliser ce principe afin de trier une liste. L'idée est de parcourir la liste dans un sens, et lorsqu'on trouve deux éléments consécutifs dans le mauvais ordre (l'un plus "léger" que l'autre), de les échanger de place. La liste va être parcourue de cette façon autant de fois qu'il est néces- saire pour ne plus avoir à faire d'échange. Elle est alors triée.

Par exemple avec une liste contenant initialement [3,

6, 4, 1, 5], l'algorithme va faire une première boucle sur les index i de la liste, au cours de laquelle il va comparer les éléments aux index consécutifs (i, i+1) et donc faire des inversions des valeurs entre les index (1,2) puis (2,3) puis (3,4).

À la fin de la première boucle, la liste est ordonnée suivant la dernière colonne de l'illustration.

1 En utilisant votre nom et votre prénom bien sûr !!!%

2 Documentation pour l'utilisateur, commentaires pour le développeur là où il y a quelque chose de spécial ou difficile à comprendre dans le code — pas de commentaire pour des opérations triviales.

3 6 4 1 5 0

1 2 3 4

3 6 4

1 5

3

6 4 1 5

3

6 4 1 5 0

1 2 3 4

i=1 i=2 i=3 3

6 4 1 5

index i=0

(2)

IUT ORSAY Page 2 2014-2015

Mesures physiques Semestre S'1

Comme il y a eu des inversions, le tri n'est peut-être pas complet, l'algorithme va donc faire une seconde fois la boucle sur sur les index i de la liste, au cours de laquelle il va faire une inversion des valeurs entre les index (1,2).

Comme il y a encore eu des inversions, le tri n'est tou- jours peut-être pas complet, l'algorithme va donc faire une troisième fois la boucle sur sur les index i

de la liste, au cours de laquelle il va faire une inver- sion des valeurs entre les index (0,1) !!!s

L'algorithme va encore effectuer une dernière passe de boucle sur la liste et compter qu'il n'y a aucune inversion, la liste est bien triée.

2. Codage du tri à bulles

Note !!!P Pour tester votre algorithme de tri à bulles, utilisez entre autres une liste avec les valeurs don- nées dans l'introduction, vous pourrez ainsi comparer ce que vous obtenez à chaque passe de la boucle avec le fonctionnement prévu, simplement en affichant la liste (code de débogage à commenter ou supprimer lorsque cela fonctionne !!!%).

Créez un module Python tribulle.py dans votre répertoire de partiel.

Placez l'ensemble des codes de test des fonctions, basé sur des cas simples (donc vérifiables de tête) à la fin du module dans un seul bloc if__name__=='__main__':.

Dans ce module, définissez les fonctions suivantes – et réalisez + exécutez le code de test au fur et à mesure !!!s

Fonction uneboucle(lst) qui prend en paramètre la liste à trier, effectue une fois la boucle en réalisant les inversions des éléments aux index consécutifs de la liste qui ne sont pas dans le bon ordre. La fonction modifie directement la liste donnée en paramètre (« effet de bord »), pas besoin de travailler sur une copie. La fonction retourne un booléen vrai s'il y a eu une inversion ou plus, et faux s'il n'y a pas eu d'inversion.

Mettez au bon endroit dans cette fonction un commentaire concernant le traitement de l'éga- lité entre deux valeurs consécutives !!!P comment faut-il traiter ce cas, et quelles peuvent être les conséquences si on le traite mal.

Fonction triabulles(lst) qui prend en paramètre la liste à trier et appelle la fonction

uneboucle() sur cette liste tant que c'est nécessaire (tant que la liste n'est pas triée) – là encore la fonction modifie directement la liste donnée en paramètre. La fonction retourne le nombre de boucle réalisées pour effectuer le tri.

Dans les cas à tester, prévoyez une liste contenant une valeur en double, une liste déjà triée dans le bon sens, et une liste déjà triée mais en sens inverse.

Dans vos tests affichez, pour chaque liste que vous triez, le nombre de boucles qui ont été nécessaires pour le tri. Conservez l'ensemble des cas qui vous semblent intéressants à tester (ne remplacez pas un cas qui fonctionne par un autre à tester !!!P gardez les deux).

0 1 2 3 4 0 1 2 3 4

3

6 4 1 5

4

6 3

1 5

4 6 3 1 5 i=0 i=1

4 6 3 1 5

4 6 3 1 5 i=2 i=3

index

0 1 2 3 4 0 1 2 3 4

4 6 3 1 5

4 6 3 1

5

3

6 4 1

5 i=0 i=1

3

6 4 1

5

3

6 4 1

5 i=2 i=3

index

(3)

IUT ORSAY Page 3 2014-2015

Mesures physiques Semestre S'1

3. Manipulation de liste de valeurs

Pour faciliter l'utilisation de la fonction de tri avec des données provenant d'ailleurs, dans votre module tribulles.py insérez les fonctions suivantes ainsi que leur code de test !!!s

Fonction alealiste(n) qui prend en paramètre un nombre entier n et retourne une nou- velle liste composée de n nombres entiers aléatoirement choisis entre 1 et n*100 (utilisez le module random vu en TP).

Fonction lectureliste(nomfichier) qui prend en paramètre le nom d'un fichier texte contenant des valeurs numériques, lit et interpréter le contenu du fichier, et retourne une liste composée des valeurs converties en nombres flottants.

Testez cette fonction sur un petit fichier « petit.txt » (cinq ou six valeurs dans le désordre) que vous créez à la main avec un éditeur de texte.

Fonction ecritureliste(nomfichier, lst) qui prend en paramètre un nom de fichier texte ainsi qu'une liste de nombres flottants, et écrit ces nombres dans le fichier, sous forme de texte, avec une valeur par ligne.

Fonction trifichier(nomfichier) qui prend en paramètre un nom de fichier texte contenant des valeurs numériques, charge les valeurs, les tri, et les réécrit dans un nou- veau fichier nommé avec le même nom auquel on ajoute l'extension ".bis".

Dans le code de test de ces trois fonctions, prévoyez d'écrire un fichier « grand.txt » qui contienne environ 4000 valeurs non triées – pour avoir des valeurs flottantes, vous pouvez utiliser les valeurs entières générées par alealiste() et les modifier en les divisant par 10 ou en faisant un calcul flottant dessus (ex. un logarithme).

4. Tri cocktail

En voyant le tri à bulles fonctionner, on s’aperçoit qu'il est particulièrement inefficace si une petite valeur est positionnée à la fin de la liste (par exemple [2,3,4,5,6,1]) !!!s il faut une boucle com- plète pour décaler cette valeur d'un seul cran, et donc autant de boucles complètes qu'il y a de décalages à faire.

Le « tri cocktail » est une variante du tri à bulles, où la liste a trier va être parcourue alternative- ment dans un sens puis dans l'autre, ce qui accélère le bon placement des valeurs (une autre opti- misation consiste à réduire l'espace de tri à chaque boucle, mais nous ne l'utiliserons pas ici).

Pour ce faire, encore dans votre module tribulles.py, insérez les fonctions suivantes ainsi que leur code de test !!!s

Fonction boucleinverse(lst) qui prend en paramètre la liste à trier, effectue une fois la boucle en parcourant la liste dans l'ordre inverse, et en réalisant les inversions des élé- ments aux index consécutifs de la liste qui ne sont pas dans le bon ordre. La fonction modi- fie directement la liste donnée en paramètre (« effet de bord »), pas besoin de travailler sur une copie. La fonction retourne un booléen vrai s'il y a eu une inversion ou plus, et faux s'il n'y a pas eu d'inversion.

Fonction tricocktail(lst) qui prend en paramètre la liste à trier et appelle alternative- ment les fonction uneboucle() et boucleinverse() sur cette liste tant que c'est néces- saire (tant que la liste n'est pas triée) – là encore la fonction modifie directement la liste donnée en paramètre. La fonction retourne le nombre de boucle réalisées pour effectuer le tri, en les comptant toutes.

Note !!!s l'amélioration liée au tri cocktail peut ne pas être visible sur des petits jeux de données !!!

une fois que cela fonctionne au niveau algorithmique sur un petit jeu de données, testez-le sur un grand jeu de donnée aléatoires, et comparez le au tri à bulles de cette façon !!!s

print("Gros alée (1000 valeurs):") testlst = alealiste(1000)

(4)

IUT ORSAY Page 4 2014-2015

Mesures physiques Semestre S'1

# Mémorisation d'une copie pour le tri cocktail memotest = testlst[:]

print("Tri à bulles en", triabulles(testlst), "passes.") print("Tri cocktail en", tricocktail(memotest), "passes.") print()

Références

Documents relatifs

Faire chanter Margaret Red Eyes Stanford, la conseillère culturelle de la mairie pour avoir cédé aux pressions des Pueblos pour que cette vente aux enchères ait lieu et qu’ils

C'est très simple et surtout, c'est logique : si un premier nombre x est plus grand qu'un deuxième nombre y et que l'on souhaite trier l'ensemble par ordre croissant, alors x et

Utiliser les fonctions tic() et toc() pour comparer le temps de tri d’un tableau contenant un grand nombre de valeurs aléatoires (10000 ?) comprises entre -100 et +100 pour les

En s’inspirant de la fonction MinTab(N,Tab) écrite dans le TD précédent, écrire maintenant la fonction RangMinTab(N,P,Tab) qui retourne cette fois le rang (et non la valeur) de la

mais tout n’est pas encore trié...... On est sûr de ne plus devoir

mais tout n’est pas encore trié...... On est sûr de ne plus devoir

[r]

J’ai été cette fille qu’on ignore, séparée des autres par le comptoir de l’entrée, à qui on commande des cafés comme si elle était barista chez Starbucks et contre