30.2 arrays : algorithmes de tri |
See You Why? |
Il existe de nombreux algotithmes de tri. La suite de ce chapitre est une approche algorithmique de l'informatique, pas indispensable pour 'bidouiller' en programmation (dont le javascript). Cependant, comme un minimum de connaissance de la mécanique aide à mieux maitriser la conduite d'un véhicule, une bonne approche de l'algorithmique favorisera une programmation efficace.
Selon les fonctions mises en place pour ces tris, les algorithmes seront plus ou moins dévoreurs de capacité de votre ordinateur. Nous essaierons d'analyser cette gourmandise de chaque méthode (ce que d'aucuns appellent complexité du code).
On songera aussi à créer un tableau d'un nombre aléatoire (mais choisi par l'internaute) de valeurs aléatoirement choisies pour que le lecteur puisse lui-même tester et comparer la complexité des algorithmes choisis.
function creer_tabl() {
<p>Entrez le nombre d'éléments que vous voulez générer dans le tableau à trier : </p>
<input id="demande" value=""> </input><button id="lancer" type="button" onclick="creer()">Lancez</button>
}
Encore faut-il générer la fonction qui créera un tableau de valeurs aléatoires, sans qu'il n'y ait trop de doublons, en autorisant des valeurs manquantes dans la liste :
function creer() {
nombre = document.getElementById("demande").value;
t=[];
for (var i=0;i<=nombre-1;i++) {
//tire un nombre entier au hasard plus petit ou égal à nombre
//Math.floor donne la partie entière
// Math.random() donne une nombre au hasard entre 0 et 1 non compris
value=Math.floor(Math.random()*nombre);
t.push(value);
}
document.getElementById("tableaualeatoire").innerHTML = t.join(" ");
}
Nous aborderons ensuite successivement :
Soit à trier la liste suivante : 7, 3, 4, 0, 2, 1, 6, 5.
Le principe est de :
* rechercher le plus petit élément [ou le plus grand] de la liste reçue (non triée) ;
* l'échanger avec le premier élément de la liste [ou le dernier] ;
* recommencer avec la nouvelle liste des éléments non triés.
| 7 | 3 | 4 | 0 | 2 | 1 | 6 | 5 | je recherche le plus petit élément des éléments non triés |
| 7 | 3 | 4 | 0 | 2 | 1 | 6 | 5 | je l'échange avec le premier élément des éléments non triés et le retire de la liste des éléments non triés |
| 0 | 3 | 4 | 7 | 2 | 1 | 6 | 5 | je recherche le plus petit élément des éléments non triés |
| 0 | 3 | 4 | 7 | 2 | 1 | 6 | 5 | je l'échange avec le premier élément des éléments non triés et le retire de la liste des éléments non triés |
| 0 | 1 | 4 | 7 | 2 | 3 | 6 | 5 | je recherche le plus petit élément des éléments non triés |
| 0 | 1 | 4 | 7 | 2 | 3 | 6 | 5 | je l'échange avec le premier élément des éléments non triés et le retire de la liste des éléments non triés |
| 0 | 1 | 2 | 7 | 4 | 3 | 6 | 5 | je recherche le plus petit élément des éléments non triés |
| 0 | 1 | 2 | 7 | 4 | 3 | 6 | 5 | je l'échange avec le premier élément des éléments non triés et le retire de la liste des éléments non triés |
| 0 | 1 | 2 | 3 | 4 | 7 | 6 | 5 | je recherche le plus petit élément des éléments non triés |
| 0 | 1 | 2 | 3 | 4 | 7 | 6 | 5 | je l'échange avec le premier élément des éléments non triés et le retire de la liste des éléments non triés |
| 0 | 1 | 2 | 3 | 4 | 7 | 6 | 5 | je recherche le plus petit élément des éléments non triés |
| 0 | 1 | 2 | 3 | 4 | 7 | 6 | 5 | je l'échange avec le premier élément des éléments non triés et le retire de la liste des éléments non triés |
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | je recherche le plus petit élément des éléments non triés |
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | je l'échange avec le premier élément des éléments non triés et le retire de la liste des éléments non triés |
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | je recherche le plus petit élément des éléments non triés |
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | je l'échange avec le premier élément des éléments non triés et le retire de la liste des éléments non triés |
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Le lecteur attentif constatera donc que la fonction trier_selection ne comporte que deux sous-programmes :
* rechercher le plus petit élément d'une liste non triée ;
* échanger un élément avec un autre de la liste (ou retirer d'une liste à trier et placer dans une liste triée).
Pour rechercher le plus petit élément d'une liste ou un tableau,
* je crée une fonction chercher_min() ;
* je lui passe un paramètre arr qui sera le tableau ou array à trier ;
* je détermine long la longueur ou nombre d'éléments de ce tableau ;
* je considère (provisoirement) le premier élément comme le plus petit du tableau mini ;
* pour chaque élément suivant de la liste :
• si cet élément est plus petit que l'élément mini, alors :
+ cet élément est à considérer comme le nouvel élément le plus petit du tableau mini ;
* en fin de parcours des éléments de la liste, l'élément mini est le plus petit de la liste.
En JS on écrira :
function chercher_min(arr) {
var long = arr.length;
var mini = arr[0];
for (j = 1; j<long; j++) {
if (arr[j]<mini) {
mini = arr[j];
}
}
return mini;
}
Pour échanger deux éléments de place :
* je crée une fonction echanger_elt() ;
* je lui passe deux paramètres un et deux, à savoir les éléments à changer de place ;
* je place le premier élément un dans une variable provisoire provi ;
* je place le deuxième deux à la place du premier un ;
* Je place le premier élément placé provisoirement dans provi et le mets dans la variable deux.
En JS j'écrirai :
function echanger_elt(un, deux) {
provi = un;
un = deux;
deux = provi;
}
voir suite >>>