Outils pour utilisateurs

Outils du site


itc:tps:tp5:exercice1

Ceci est une ancienne révision du document !



Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172

Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Tri par insertion dichotomique

Le tri par insertion est comparable au tri par sélection vu dans le TP2

Vous pouvez aussi trouver des cours dans la partie 1ere NSI de ce site : une fiche à imprimer et un cours sur le tri par insertion.

Principe

On considère une tableau L d'éléments comparables que l'on trie selon le protocole suivant.

  • On classe au fur et à mesure de l'avancée dans le tableau :
    • si le tableau n’a qu’un seul élément il est déjà trié,
    • sinon on prend le deuxième et on le compare au premier pour les mettre dans le bon ordre.
  • Si on suppose les i premiers éléments déjà classés on prend le (i + 1)-ème que l’on compare, par exemple en descendant à partir de la position i, jusqu’à trouver, ou pas, un plus petit que lui et l'insérer alors à la bonne place.

Algorithme

FONCTION tri_par_insertion
ENTRÉE: tableau_a_trier, le tableau à trier
La fonction ne renvoie rien, le tableau est trié en place
DÉBUT
  soit n la longueur de tableau_a_trier
  POUR i allant de 1 à n - 1 FAIRE
    soit item l'élément de rang i dans tableau_a_trier
    soit j = i
    TANT QUE j > 0 et l'élément de rang j-1 supérieur à item FAIRE
      copier l'item de rang j-1 au rang j
      j passe à j-1
    FIN
    copier item au rang j
  FIN
FIN

Ici, le tri se fait en place, ce qui est une bonne chose du point de vue de l'utilisation de la mémoire. On peut apporter des améliorations pour limiter le nombre de comparaisons ou d'échanges, mais cela ne change pas le principe d’insertion : il y a deux boucles imbriquées, ici une boucle globale en for et à l'intérieur une boucle en while.

  1. Traduisez cet algorithme en Python et testez.
  2. Écrivez une fonction liste_aleatoire(N:int, n:int) créant une liste aléatoire de n entiers i tels que 0 ⇐ i < N.
  3. À l’aide de la fonction time du module time, donner la durée d’exécution de la fonction tri_insertion pour quelques listes aléatoires de grande taille.
    On pourra commencer par

$N = 10^7$ et $n$ dans $\left\lbrace 100, 1000, 10 000\right\rbrace$.

On prouvera plus tard la correction du programme et on étudiera sa complexité.

L'insertion dichotomique

En profitant du fait qu'au moment de chaque insertion, le début de liste est déjà trié, on peut procéder à une insertion dichotomique selon l'algorithme qui suit :

FONCTION recherche_rang_insertion
ENTRÉES
    L: un tableau
    a, b: deux indices de L, a <= b. L[a:b] est trié dans l'ordre croissant
    e: un élément de même nature que ceux de L
SORTIE
    l'indice a <= i <= b auquel il faudrait insérer e pour respecter l'ordre
DÉBUT
    TANT QUE a != b RÉPÉTER
        indice_milieu est (a + b) // 2
        m est la valeur de L en indice_milieu
        SI m <= e ALORS
            continuer avec la zone [indice_milieu + 1 : b]
        SINON
            continuer avec la zone [a:indice_milieu]
        FIN
    FIN
    RENVOYER a
FIN

On montre que la complexité dans le pire des cas du tri avec insertion dichotomique est en $n\,\ln(n)$.

  • Commencez par écrire une fonction %%recherche_rang_insertion(L:list, a:int, b:int, e) → int traduisant l'algorithme ci-dessus.
  • Écrivez une fonction qui implémente le tri par insertion dichotomique.
itc/tps/tp5/exercice1.1641064447.txt.gz · Dernière modification : de goupillwiki