Aller au contenu

4.4 Tri par sélection⚓︎

image

Voici le lien du notebook associé.

T4.4_Tri_par_sélection

1. Animation⚓︎

Considérons la liste [5, 4, 2, 1]
Voici le fonctionnement de l'algorithme :

2. Principe⚓︎

description de l'algorithme

Le travail se fait essentiellement sur les indices.

  • du premier élément jusqu'à l'avant-dernier :
    • on considère que cet élément est l'élément minimum, on stocke donc son indice dans une variable indice_min.
    • on parcourt les éléments suivants, et si on repère un élément plus petit que notre mininum on met à jour notre indice_min.
    • une fois le parcours fini, on échange l'élément de travail avec l'élément minimum qui a été trouvé.

3. Implémentation de l'algorithme⚓︎

Tri par sélection ❤

def tri_selection(liste) :
    for i in range(len(liste) - 1):
        indice_min = i
        for j in range(i + 1, len(liste)) :
            if liste[j] < liste[indice_min]:
                indice_min = j
        liste[i], liste[indice_min] = liste[indice_min], liste[i]

Application :

4. Complexité de l'algorithme⚓︎

4.1 Étude expérimentale⚓︎

A l'aide du cours sur la complexité proposer sur le notebook associé, des mesures expérimentales pour déterminer la complexité du tri par insertion.

Nous allons fabriquer deux listes de taille 100 et 200 : Pour le tri par sélection, il n'y a pas cas plus défavorable comme dans le tri par insertion (cas de la liste triée dans l'ordre insère de celui recherché). Il faut pour chaque valeur du tableau, parcourir toutes les valeurs non triées.

4.2 Calcul du nombre d'opérations⚓︎

Dénombrons le nombre d'opérations, pour une liste de taille \(n\).

  • boucle for : elle s'exécute \(n-1\) fois.
  • deuxième boucle for imbriquée : elle exécute d'abord \(n-1\) opérations, ..., puis 3, puis 2, puis 1.

On a donc : \(n-1+\dots+3+2+1=\dfrac{n \times (n-1)}{2}\)

Le terme de plus haut degré de l'expression \(\dfrac{n \times (n-1)}{2}\) est de degré 2 : le nombre d'opérations effectuées est donc proportionnel au carré de la taille des données d'entrée.
Ceci démontre que le tri par sélection est de complexité quadratique.

Vérification expérimentale

Insérez un compteur c dans votre algorithme pour vérifier le calcul précédent. On pourra renvoyer cette valeur en fin d'algorithme par un return c.

5. Preuve de l'algorithme⚓︎

5.1 Preuve de la terminaison de l'algorithme⚓︎

Est-on sûr que notre algorithme va s'arrêter ?

À l'observation du programme, constitué de deux boucles for imbriquées, il n'y a pas d'ambiguïté : on ne peut pas rentrer dans une boucle infinie. Le programme s'arrête forcément au bout de d'un nombre fixe d'opérations. D'après nos calculs sur la complexité, ce nombre de tours de boucles est égal à \(\dfrac{n \times (n-1)}{2}\).

Ceci prouve que l'algorithme se terminera.

5.2 Preuve de la correction de l'algorithme⚓︎

Est-on sûr que notre algorithme va bien trier notre liste ?

Nous verrons la correction de l'algorithme de tri par insertion dans un autre cours.

6. Bonus : comparaison des algorithmes de tri⚓︎

Une jolie animation permettant de comparer les tris :

image

Issue de ce site.

7. Exercices_Algorithmes_de_tris⚓︎

Travail à réaliser sur le notebook Capytale du lien suivant:

T4.4_Exercices_Algorithmes_de_tris


Dernière mise à jour: 2025-03-21