T7.1 Tri par sélection⚓︎
7.1.1 Pourquoi étudier des algorithmes de tri ?⚓︎
Autant ne pas le cacher, ces algorithmes sont déjà implémentés (quelque soit le langage) dans des fonctions très performantes.
En Python, on utilise la fonction sort()
:
>>> tab = [4, 8, 1, 2, 6]
>>> tab.sort()
>>> tab
[1, 2, 4, 6, 8]
Le meilleur de nos futurs algorithmes de tri sera moins efficace que celui de cette fonction sort()
...
Malgré cela, il est essentiel de se confronter à l'élaboration manuelle d'un algorithme de tri:
- besoin pratique de trier;
- tri comme sous-programmes;
- utilisation de toutes les techniques informatiques.
Le tri par sélection est le premier des deux algorithmes de tri que nous allons étudier (nous étudierons aussi le tri par insertion).
Ces deux algorithmes ont pour particularité de :
- ne pas nécessiter la création d'une nouvelle liste. Ils modifient la liste à trier sur place.
- ne pas faire intervenir de fonctions complexes.
7.1.2 Principe du tri⚓︎
On cherche à trier un tableau de \(n\) valeurs différentes, en général les entiers de \(0\) à \(n-1\).
- En partant de l'indice 0, on cherche l'indice du plus petit élément en parcourant le tableau;
- on l'échange avec l'élément d'indice 0;
- On recommence en partant de l'indice 1, puis 2, etc. jusqu'à ce que le tableau soit trié.
Exercice 1
On veut écrire une fonction tri_selection
qui prend en paramètre une liste et qui trie cette liste par l'algorithme du tri par sélection.
- Écrire un jeu de tests pour cette fonction.
- Compléter puis tester la fonction ci-dessous.
1 2 3 4 5 6 7 8 9 10 11 |
|
Exercice 2
On va s'intéresser au temps d'éxécution de ce tri, et plus particulièrement au lien entre la taille de la liste donnée en entrée et ce temps d'éxécution.
On définit donc :
- une fonction
alea
qui renvoie une liste de taillen
créée aléatoirement; - une fonction
chrono
qui prend en paramètre un entiern
et qui renvoie le temps d'éxécution de la fonctiontri_selection
pour la liste construite à partir de la fonctionalea
.
- Compléter les fonctions dont les extraits sont fournis ci-dessous.
- Construire une liste (en compréhension si possible) des temps obtenus pour les valeurs de
n
suivantes : 10, 100, 1000, 10000. - Quel semble être le lien entre
n
et le temps d'éxécution?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
- On va visualiser tout ça...
1 2 3 4 |
|