Académique Documents
Professionnel Documents
Culture Documents
Histoire de l’informatique
Représentation des données
Traitement des données en tables
Interaction entre l’homme et la machine sur le WEB
Architectures matérielles et système d’exploitation
Langages et programmation
Algorithmique
1. Historique
Betty Holberton (1917-2001)
Informaticienne, Betty Holberton est connue pour avoir été l’une des six programmatrices
originelles de l’ENIAC, le premier ordinateur électronique.
Pendant la Seconde Guerre Mondiale, elle est embauchée par la Moore School of Electrical Engineering en tant que
calculatrice. Elle est vite choisie pour être l’une des six programmatrices de l’ENIAC, avec Kay McNulty, Marlyn
Wescoff, Ruth Lichterman, Betty Jean Jennings, et Fran Bilas.
Elle y développe le premier code de construction, la première routine de tri et la première application logicielle.
Après la guerre, en 1959, elle est nommée directrice de la branche Recherche en Programmation du David Taylor
Model Basin, laboratoire de mathématiques appliquées. Elle participe également à développer l’Univac (la division
informatique de Remington Rand).
En 2001, celle qui est considérée comme la pionnière du logiciel par Donald E. Knuth meurt d’une maladie
cardiaque à l’âge de 84 ans.
« Source Wikipedia »
La première carte est considérée comme à sa place. Pour chaque carte, en commençant par la seconde, on recherche
s’il est possible de la déplacer vers la gauche.
Partie triée
2ème passage
Résultat après
l’opération
5ème passage
6 T[j] T[j - 1]
n°2
7 jj–1
Fin tant que
8 T[j] Temp
Fin pour
4. Complexité
Cas favorable (la liste est déjà triée)
Ligne Nombre d’affectations Nombre de comparaisons Nombre d’opérations
1
2
3
4
Il serait possible de gagner un peu de temps à la ligne 5 en plaçant la condition Temp < T[j-1] en premier.
Rappelez-vous qu’avec un « and », le second membre est évalué uniquement si le premier est « True ».
Cas le plus défavorable (la liste est triée dans l’ordre inverse de celui souhaité)
Dans ce cas, il faut déterminer le nombre de fois que la boucle n°2 est exécutée. Ce dernier dépend de la valeur de
i :
Quand i = 1 1 fois
Quand i = 2 2 fois
. Total = 1 + 2 + 3 + …. + (n - 1) =
.
. ………………………………………….
Quand i = n – 1 n - 1 fois
Le résultat précédent est obtenu grâce à la somme des (n – 1) premiers termes d’une suite arithmétique
Cas moyen
Pour obtenir la complexité dans ce cas, il suffit de faire la moyenne entre le cas le plus favorable et le cas le plus
défavorable :
Cas Coût
Le plus favorable
Le plus défavorable Coût moyen (n) =
…………………..
Conclusion
Avec une complexité moyenne quadratique O(n²), le tri par insertion n’est pas très performant lorsque les
données à trier sont importantes.
Cependant, du fait d’une complexité linéaire O(n) sur une liste déjà triée, il est l’un des plus rapide lorsque la
liste est pratiquement déjà triée, c’est pourquoi on le trouve souvent combiné à un tri fusion.
Une boucle « for » étant exécutée un nombre fini de fois (connu à l’avance) ne pose jamais de problème de
terminaison. Il n’en n’est pas de même pour la boucle « while » dont on ne connaît pas à l’avance le nombre de
fois qu’elle sera itérée. Pour prouver la terminaison de cette dernière, il faut prouver l’existence d’un
« convergent » :
Le convergent est ici la variable j qui est initialisée à une valeur positive avant l’entrée dans la boucle puis
décrémentée ensuite dans la boucle. A un moment donné, j va donc « converger » vers 0 entrainant ainsi la sortie
de la boucle.
6. Correction de l’algorithme
Une fois que l’on a prouvé qu’un algorithme se termine effectivement, il reste à vérifier que celui-ci produit bien le
résultat attendu. Pour se faire, nous allons nous appuyer sur un principe mathématique que l’on appelle « la
démonstration par récurrence » d’une propriété de l’algorithme :
La propriété que l’on cherche à démontrer s’appelle « un invariant de boucle », c'est-à-dire une propriété qui reste
vraie à chaque passage dans la boucle. En se basant sur le principe du tri par insertion qui consiste à insérer un
élément dans une partie déjà triée, nous allons donc choisir comme invariant de boucle :
Initialisation (i = 1)
Le second élément du tableau est comparé avec le premier, s’il est plus grand, ils sont inversés. Au final, le tableau
T[0 : 1] est trié à la fin de la première boucle.
Hérédité
On suppose désormais que le tableau T[0 : i] est trié et on va démontrer que T[0 : i + 1] le sera aussi. L’élément
T[i + 1] est comparé avec ceux qui le précèdent. Tant que celui-ci est plus petit que celui qui le précède, il y a
inversion. Au final, l’élément T[i + 1] sera correctement positionné dans le tableau : le tableau T[0 : i + 1] sera
donc trié.
Conclusion
Quelle que soit la valeur de i, le tableau T[0 : i] est trié. Après exécution de la dernière boucle, le tableau sera donc
trié. Cela prouve la correction de l’algorithme de tri par insertion.
7. Stabilité
Supposons que l’on souhaite trier les carrés de couleurs ci-dessous selon la valeur qu’ils contiennent :
5 12 7 5 8 12
5 5 7 8 12 12
On remarque que les carrés jaune et bleu, bien que de même valeur ont été inversés. Il en est de même pour les
carrés de valeur 12.
5 5 7 8 12 12
A tester …
Le tri par insertion est stable. Pour le vérifier, il suffit de modifier légèrement le programme afin qu’il puisse
effectuer le tri des carrés précédents : le carré jaune peut être représenté par [5, "Jaune"], …
8. Travail à effectuer
Ecriture de la fonction
Ecrire une fonction Tri_insertion permettant de trier une liste de nombres par ordre croissant en appliquant le
principe du tri par insertion, puis appliquer cette fonction sur la liste [14, 7, 5, 15, 11, 64, 3, 9].
Vérifier que cette fonction permet également de trier des mots en l’appliquant sur la liste de mots ci-dessous
["Bonjour", "Chat", "Bonsoir", "Autruche", "Oie", "Chien"].
Tests d’efficacité
Afin de vérifier les calculs précédents, nous allons générer une liste de nombres entiers aléatoires et mesurer le
temps nécessaire pour effectuer le tri en ajoutant dans le programme principal les lignes de code suivantes (vous
devrez faire un « import time » et un « import random » au préalable) :
Ajouter l’instruction « liste.sort() » au programme afin que la liste soit triée avant que l’on ne lance le tri par
insertion, puis compléter le tableau Excel correspondant.
Que remarquez-vous ?
...............................................................................................................................................................................................................................................................
Stabilité
Vérifier la stabilité du tri par insertion en modifiant le programme précédent afin qu’il puisse effectuer le tri des
cubes ci-dessous :
5 12 7 5 8 12