Tri par insertion

Le tri par insertion est très similaire à l’algorithme de tri par sélection. Il est très intuitif et maintient également la partie gauche du tableau triée, puis itère progressivement vers la fin du tableau.
Video preview
Plus précisément, dans l’algorithme de tri par insertion, on commence par l’élément le plus à gauche et on avance pas à pas vers la droite. Dès qu’on trouve un élément plus petit que ceux placés à sa gauche, on décale un à un tous les éléments pour libérer un emplacement pour la valeur en cours et on la place à sa position correcte. Ainsi, si l’on dispose d’un tableau [0, 2, 4, 1, 10, 8] et que l’on s’intéresse à la valeur 1, on décalera d’abord 4, puis 2 vers la droite, avant de placer 1 entre 0 et 2. On obtient alors [0, 1, 2, 4, 10, 8]. On passe ensuite à l’élément 10. On ne fait rien puisqu’il est plus grand que tous les éléments de gauche. Puis, on prend 8 et on décale 10 vers la droite pour placer 8 entre 4 et 10.
a = [...]
for i in range(1, len(a)):              # on commence à partir du deuxième élément
    while i > 0 and a[i] < a[i - 1]:    # tant que l'élément courant est plus petit
        a[i - 1], a[i] = a[i], a[i - 1] # on décale l'élément courant avec son prédécesseur
        i -= 1                          # on met à jour l'indice de l'élément courant
print(a)
Le tri par insertion insère donc l’élément courant à sa position correcte dans la partie déjà traitée du tableau. Dans le pire des cas, si les éléments du tableau sont en ordre décroissant, on devra décaler tous les éléments situés avant i pour positionner l’élément au bon endroit. Cela entraîne un total d’opérations en .
 
Faisons une simulation sur plusieurs tableaux :
[4, 1, -1, 0, 2, 8]
  1. i = 1 ⇒ swap ⇒ [1, 4, -1, 0, 2, 8]
  1. i = 2 ⇒ swap ⇒ [1, -1, 4, 0, 2, 8] ⇒ swap ⇒ [-1, 1, 4, 0, 2, 8]
  1. i = 3 ⇒ do nothing
  1. i = 4 ⇒ swap ⇒ [-1, 1, 0, 4, 2, 8] ⇒ swap ⇒ [-1, 0, 1, 2, 4, 8]
  1. i = 5 ⇒ do nothing
  1. print [-1, 0, 1, 2, 4, 8]
[10, 5, 1, -7]
  1. i = 1 ⇒ swap ⇒ [5, 10, 1, -7]
  1. i = 2 ⇒ swap ⇒ [5, 1, 10, -7] ⇒ swap ⇒ [1, 5, 10, -7]
  1. i = 3 ⇒ swap ⇒ [1, 5, -7, 10] ⇒ swap ⇒ [1, -7, 5, 10] ⇒ swap ⇒ [-7, 1, 5, 10]
[1, 2, 3, 4, 5]
  1. i = 1 ⇒ do nothing
  1. i = 2 ⇒ do nothing
  1. i = 3 ⇒ do nothing
  1. i = 4 ⇒ do nothing

Challenge

Étant donné n entiers, triez-les par ordre croissant en utilisant le tri par insertion.

Entrée

La première ligne de l’entrée contient un entier n (1 ≤ n ≤ 1000) représentant le nombre d’éléments du tableau.
La ligne suivante contient n entiers séparés par des espaces ().

Sortie

Le programme doit afficher le tableau initial trié dans l’ordre croissant.

Exemples

Entrée
Sortie
5 5 5 3 2 3
2 3 3 5 5
 

Constraints

Time limit: 2 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue