Tri par sélection

Pour simplifier nous allons trier une liste de 9 valeurs

[ 8, 6, 3, 9, 2, 1, 4, 5, 7 ]

pour commencer l’explication , utilisons 2 listes

Tri par sélection

A faire: sur le document réponse Libre Office.

Réaliser le même schéma avec [ 5, 12, 3, 7, 4 ] sur le document réponse Libre Office. En fin de document vous pouvez découper les numéros pour faire une simulation à la main.

Combien de comparaison? pour trier [ 8, 6, 3, 9, 2, 1, 4, 5, 7 ]

pour sélectionner l’élément le plus petit on liste les 9 valeurs et on fait 8 comparaisons, pour le deuxième on fait 7 comparaisons, pour le troisième 6 comparaisons et ainsi de suite. D’où nombre de comparaison= 8+7+6+….+1=36.

Par extension si notre liste est constituée de n valeurs, le nombre de comparaison = (n-1)+(n-2)+(n-3)+ …..+3+2+1 en factorisant nombre de comparaison=n*(n-1) /2 soit n²/2-n/2 .

On dit que l’algorithme de tri par sélection a donc une complexité en O(n²). On parle aussi de complexité quadratique.

Voici une implémentation sous python avec 2 tableaux ou listes comme le graphique ci dessus

def tri_selection(tableau):
    '''tri d'un tableau, l'argument tableau est un tableau ou liste, la fonction renvoie un autre tableau ou liste resultat'''
    resultat = [] 
    longueur = len(tableau)                 
    
    while len(resultat) != longueur:        
        minimum = tableau[0]                   
        
        for i in range(1, len(tableau)):        
            if minimum > tableau[i]:                
                minimum = tableau[i]                    
        resultat.append(minimum)                
        tableau.remove(minimum)                 
    return resultat 

voici l’algorithme du tri par sélection ( ici une seule liste )

  • PROCEDURE tri_Selection ( Tableau a[1:n])
  •     POUR i VARIANT DE 1 A (n – 1) FAIRE
  •         TROUVER [j] LE PLUS PETIT ELEMENT DE [i + 1:n];
  •         ECHANGER [j] ET [i];
  • FIN PROCEDURE;

en python à essayer

def tri_selection(tab):
   print(tab)
   for i in range(len(tab)):#boucle sur toute la liste
      # Trouver le min
       min = i
       for j in range(i+1, len(tab)):
           if tab[min] > tab[j]:
               min = j

       tmp = tab[i]
       print('tmp',tmp)#affiche tmp pour visualiser l'algo
       tab[i] = tab[min]
       print ('tab1',tab)#affiche la liste tab pour visualiser l'algo
       tab[min] = tmp
       print('tab2',tab)#affiche la liste tab pour visualiser l'algo
   return tab
# Programme principale pour tester le code ci-dessus
tab = [98, 22, 15, 32, 2, 74, 63, 70]#changer les valeurs de la liste pour un autre essai

tri_selection(tab)

print ("Le tableau trié est:")
print (tab)

vous pouvez trouver des explications supplémentaire ici:

site de podcastscience , site de David Roche et sur le site http://lwh.free.fr

Retour vers article algorithme de tri