C18.2 : Tri par sélection

L'algorithme de tri par sélection est un algorithme classique qui permettent de trier une liste.

Principe

Lien : Visualisation du principe du tri par selection

Algorithme

🖊️ Repérer les actions qui sont répétées.

Afficher la correction

Les actions répétées sont :

  • - la recherche du maximum dans la partie non triée et le placement de l'élément trouvé à la fin de la partie triée ;
  • - pour la recherche du maximum, la comparaison de l'élément retenu avec tous les autres éléments de la partie non triée.

🖥️ Proposer une fonction qui prend une liste en paramètre et modifie cette liste pour qu'à la fin de l'exécution de la fonction la liste soit triée par ordre croissant.

🖥️ Compléter avec le programme principal qui permet de tester la fonction avec une liste de 20 nombres entiers choisis aléatoirement entre 0 et 99.

Afficher la correction
from random import randint

def tri_selection(L):
    '''
    Tri la liste L du plus grand au plus petit
    param L: (list) Liste de nombres entiers
    effets de bord : le paramètre L est modifié
    '''
    for i in range(0, len(L)-1):
        pos_max = i
        for j in range(i+1, len(L)):
            if L[j] > L[pos_max]:
                pos_max = j
        L[pos_max], L[i] = L[i], L[pos_max]

# -----Programme principal-----
liste = [randint(0,99) for _ in range(20)]
print(liste)
tri_selection(liste)
print(liste)

Analyse de l'algorithme

Terminaison de l'algorithme

🖊️ Démontrer la terminaison de l'algorithme.

Afficher la correction

La preuve de la terminaison de l'algorithme est immédiate car l'algorithme est composé de deux boucles for.

Correction de l'algorithme

🖊️ Proposer un invariant pour chacune des deux boucles.

Afficher la correction

L'invariant pour la boucle de recherche de la position du plus grand élément dans la partie non triée (boucle interne) est :

« L'élément à la position pos_max est plus grand que tous les éléments de i à j ».

L'invariant pour la boucle qui permet de trier un élément supplémentaire (boucle externe) est :

« La partie du tableau de 0 à i est triée ».

Coût

🖊️ Pour quelle configuration de liste l'algorithme fait-il le moins de comparaison ? Dans ce cas combien en fait-il ?

🖊️ Pour quelle configuration de liste l'algorithme fait-il le plus de comparaison ? Dans ce cas, combien en fait-il ?

Afficher la correction

L'algorithme fait toujours le même nombre de comparaisons, quelque soit la liste de départ.

Si on note n la longueur de la liste à trier, dans ce cas il fait (n-1) + (n-2) + ... + 3 + 2 + 1 = n×(n-1)/2.

Remarque : 1 + 2 + 3 + ... + k = k×(k+1)/2

Le coût de l'algorithme est proportionnel à n², on dit que le coût est quadratique.

Pour aller plus loin

Lien : Algorithmes de tri

Lien : Algorithmes de tri animés