ChronoMath, une chronologie des MATHÉMATIQUES
à l'usage des professeurs de mathématiques, des étudiants et des élèves des lycées & collèges


Un programme récursif de tri numérique en JavaScript
   
» chaînes et tableaux en JavaScript | » Cas alphanumérique

L'instruction de tri L.sort(), List sort : trier Liste, existe en JavaScript mais notre objectif est de la réécrire au moyen d'une procédure récursive dans le cas de valeurs numériques. Dans le langage JavaScript, une liste (tableau à 1 dimension) de n éléments est un n-uplet noté [e0,e1,e2,...,en-1], les ei sont des chaînes de caractères, comme par exemple "chat", "rose blanche", mais aussi "100". Et là est le petit problème car le langage use de l'ordre lexicographique, celui du dictionnaire. En ce sens 100, commençant par 1 est inférieur à 7 !

Nous allons adapter ici le programme décrit dans le cas d'un tri alphanumérique. Le principe récursif de ce tri est simple :

Tri[Ln] = Min(Ln) + Tri[Ln-1]

   Si à une étape intermédiaire, la liste s'avère triée, le programme ne s'en aperçoit pas : chaque élément reste à sa place. Le lecteur intéressé pourra sans difficultés améliorer le programme par un test consistant à vérifier que le plus petit élément est le premier.

La condition d'arrêt est gérée par l'instruction while(lg>0) : lg désignant la longueur de la liste qui reste à trier. Si lg = 0, le tri est terminé.

Soit à trier alphabétiquement la liste L =  [9,3,2,5] en la liste L_tri. On a lg = 4.

 !  Petit souci : comme évoqué en préambule, en tant qu'élément d'une liste, 100 sera considéré comme une chaîne de caractères et par conséquent 100 < 7 (ordre lexicographique). Il faut donc récupérer la valeur numérique des éléments de la liste. Mais JavaScript est capricieux et refuse de considérer comme numérique les eval(L.slice(0,1)) et eval(L.slice(i,i+1)). On rajoute alors un join() qui convertit les L.slice en chaînes de caractères dont on peut récupérer la valeur numérique. Par ailleurs, l'instruction L = L.split(car) retourne dans L la liste des mots séparés par car (une virgule par exemple).

» fonctions  join , split , concat , slice , splice

<SCRIPT LANGUAGE=JavaScript>
var lg=1
function va_trier()
{
L=[
100,7,-8,20,3,1]
L=prompt("Donnez votre liste en séparant par des virgules :",L)
L=L.split(",")   
 
list_tri=[ ]      
// liste triée, vide au départ
trier(L)
alert(list_tri)
}

function trier(L)
 // fonction récursive de tri         
{
while(lg>0)
{
lg=L.length;M=Min(L);
// M est la liste [min,idx] qui reste à trier obtenue dans Min()
list_tri=list_tri.concat(M[0]); 
// équivaut à list_tri = M[0]+list_tri
/

L.slice(M[1],1);lg--;
trier(L)
}
}

function Min(L)           
// recherche de l'élément minimal
{
min=eval(L.slice(0,1).join());
idx=0
for(i=0;i<lg;i++)
{
e=eval(L.slice(i,i+1).join())
if(e<min){min=e,idx=i}
}
return [min,idx]     
//  on retourne le minimum et son index (rang dans la liste)
}
</SCRIPT>

© Serge Mehl - www.chronomath.com