![]() ![]() » Insertion dichotomique dans un fichier numérique trié | » Recherche dichotomique dans un fichier trié » Liens analogiques Tri à bulles , Tri par insertion | Résolution dichotomique de l'équation f(x) = 0 » Pas de théorie, je veux utiliser le programme JavaScript |
L'ajout d'un élément dans un fichier trié ne
doit pas obliger l'utilisateur à trier de nouveau ce dernier, surtout si ce
fichier est important. On étudie ici une méthode rapide de d'insertion par
dichotomie. Dans son principe, la méthode est semblable à celle présentée dans le
recherche dichotomique d'un élément dans un fichier trié.
Dans un fichier de 1 000 000 d'éléments, la place cherchée est trouvée au bout
d'au plus n essais, n vérifiant 2n ≤ 106,
c'est à dire n × log102 ≤ 6, soit n ≤ 20.
Le programme ci-dessous traite un fichier élèves de 25 fiches. JavaScript utilise l'ordre lexicographique (celui du dictionnaire). L'algorithme ne diffère que très peu du cas numérique. Le fichier est déclaré en entrée en tant que liste (instruction new Array).
En JavaScript, une liste commence au rang 0. Par convention, afin de gérer les début et fin de fichier, on note "AA" et "ZZ" les bornes inf (rang 0) et sup du fichier élève :
var noms=new Array("AA","Aymé Marcel","AlTusi Mohamed","Balan Séverine","Baltard Victor","Bellini Amandine",
"Cage Nocolas","Chamson André","Cournan Pauline","Darel Romain","Dusseaux René","Ferreau Manon","Ferré Léo",
"Gramme Frédéric","Han Mactu","Lavalette Marco","Merry Alicia","Napier John","Othon Marc","Ponge Francis",
"Radowsky Paulette","Rochelle Jean","Schubert Etienne","Soulié Mireille","Viau Corinne","ZZ")
➔ Si, par exemple, on veut insérer un élève nommé Ali Baba, l'ordre lexicographique le placera en début de fichier entre "AA" et "Aymé Marcel"; le programme repère ce cas particulier et déclarera Ali Baba en tête de fichier.
Algorithme :
L'algorithme d'insertion d'un élément x dans un fichier trié par ordre alphabétique croissant de n éléments noms[1], noms[2], ..., noms[n] consiste à rechercher un encadrement de ce dernier entre deux éléments consécutifs du fichier. On peut le résumer ainsi :
entrer les données triées noms[0]="",noms[1], noms[2], ..., noms[n]; entrer l'élément k à insérer;
initialisation : a = 0, b = effectif de la base de noms;
Tant que b -
a > 1 faire :
t = partie entière de (a + b)/2;
si k < noms[t] alors b =
t sinon a = t;
fin si
fin tant que
Décaler tous les éléments d'un rang à partir du rang b;
Insérer k au rang a + 1;
➔ Respecter les majuscules des noms : les lettres minuscules sont codées "après" les lettres majuscules : Dupont Jean sera inséré en place 10 alors que dupont Jean sera placé en fin de fichier !