Source: Scratch Wiki en français
Ce tutoriel explique comment trier une liste de nombres.
Trier une liste
En informatique, trier une liste de nombre est une méthode nécessaire et généralement incorporée par défaut aux différents langages de programmation. Le langage Scratch ne contient pas de bloc Scratch permettant de trier une liste.
Voici quelques exemples d'utilisation d'une liste triée :
- réaliser des algorithmes de recherche plus performants, comme la dichotomie ;
- sélectionner des éléments par différence ou seuil ;
- réaliser des classements, afficher des scores de manière plus lisible ou encore réaliser un podium ;
Il existe divers algorithmes de tri. Certains sont plus efficaces que d'autres, tandis que les moins efficaces sont généralement beaucoup plus compréhensibles. Un algorithme de tri peut être défini comme efficace en fonction de ses complexités algorithmiques (le nombre moyen d'opérations réalisées) et mémorielles (l'utilisation de la mémoire de l'appareil).
Les algorithmes de tri présentés sur cette page fonctionnement par comparaison.
Algorithmes
Ce tutoriel vous propose 4 différents algorithmes de tri.
last(en copiant-collant) dans une entrée de liste attendant un indice correspond au dernier élément de liste.
Comparaison des algorithmes
La table suivante compare les divers algorithmes présentés sur cette page.
La complexité en temps des algorithmes (ou complexité algorithmique) est une grandeur servant à mesurer l'efficacité d'exécution d'un algorithme, tandis que la complexité en espace (ou complexité mémorielle) permet de mesurer l'utilisation de la mémoire par un algorithme.
Nom | Complexité algorithmique | Complexité mémorielle | ||
---|---|---|---|---|
Meilleur cas | Cas moyen | Pire cas | ||
Tri à bulles | n
|
n2
|
n2
|
1
|
Tri par insertion | n
|
n2
|
n2
|
1
|
Tri rapide | n log n
|
n log n
|
n2(cas rare)
|
n (pire cas)
|
Tri fusion | n log n
|
n log n
|
n log n
|
n (pire cas)
|
Permuter des éléments
Le bloc suivant est nécessaire à plusieurs des algorithmes de tri présentés sur cette page. Il permet d'échanger la valeur de deux éléments dans une liste.
définir Liste / Permuter \[i, j] (i) (j) mettre [var v] à (élément (i) de [liste v]) // sauvegarde de la valeur en i remplacer l'élément (i) de la liste [liste v] par (élément (j) de [liste v]) // on écrase l'élément i remplacer l'élément (j) de la liste [liste v] par (var) // on écrase l'élément j avec la valeur en mémoire
Bulles
Le tri à bulles consiste à comparer un élément à l'indice i sur tous les indices de la liste suivant, et à déplacer à cet index i l'élément le plus petit observé, qui remonte alors comme une « bulle sous l'eau ».
définir Tri à Bulles mettre [index v] à [1] // l'indice de l'élément à comparer mettre [max v] à [1] // indice maximum atteint répéter jusqu'à ce que <(index::variables) = (longueur de [liste v] :: list)> // tant que l'on n'a pas atteint la fin de la liste si <(élément (index::variables) de [liste v] :: list) > (élément ((index::variables) + (1)) de [liste v] :: list)> alors // si l’élément à l'index est plus grand que le suivant (ordre croissant) Liste / Permuter \[i, j] (index) ((index) + (1)) :: custom si <(index::variables) > [1]> alors ajouter (-1) à [index v] // on retourne à l'élément précédent fin sinon si <(index) < (max)> alors mettre [index v] à (max) // on retourne à l'indice maximum sinon ajouter (1) à [index v] // on passe à l'élément suivant fin fin si <(index) > (max)> alors mettre [max v] à (index) // on sauvegarde l'indice maximum fin fin
Insertion
Le tri par insertion consiste à remonter l'élément d'indice i jusqu'à sa bonne position.
définir Tri par Insertion mettre [index i v] à [2] // indice initial répéter jusqu'à ce que <(longueur de [liste v]) < (index i)> mettre [index j v] à ((index i) - [1]) // indice de recherche répéter jusqu'à ce que <<(élément (index j) de [liste v]) < (élément (index i) de [liste v])> ou <(index j) < [1]>> // on remonte jusqu'à la bonne position ajouter [-1] à [index j v] fin insérer (élément (index i) de [liste v]) en position ((index j) + [1]) de [liste v] supprimer l'élément ((index i) + [1]) de [liste v] // et on insère l'élément ajouter [1] à [index j v] fin
Rapide
Le tri rapide (ou « tri pivot », de l'anglais "Quick Sort") consiste à placer des pivots dans la liste et à trier respectivement à droite et à gauche de ce pivot en utilisant le principe « diviser pour régner ».
définir Tri Rapide si <(longueur de [liste v]) < (2)> alors stop [ce script v] fin supprimer tous les éléments de la liste [pivot / gauche v] supprimer tous les éléments de la liste [pivot / droite v] ajouter [1] à [pivot / gauche v] :: list ajouter (longueur de [liste v]) à [pivot / droite v] :: list répéter jusqu'à ce que <(élément [last] de [pivot / gauche v]) > (élément [last] de [pivot / droite v])> mettre [pivot / gauche v] à (élément [last] de [pivot / gauche v]) mettre [pivot / droite v] à (élément [last] de [pivot / droite v]) supprimer l'élément [last] de [pivot / gauche v] supprimer l'élément [last] de [pivot / droite v] si <(pivot / gauche :: variables) < (pivot / droite :: variables)> alors mettre [pivot / valeur v] à (élément (pivot / droite :: variables) de [liste v]) mettre [pivot / i v] à (pivot / gauche :: variables) mettre [pivot / j v] à (pivot / gauche :: variables) répéter ((pivot / droite :: variables) - (pivot / gauche :: variables)) fois si <non <(élément (pivot / i) de [liste v]) > (pivot / valeur)>> alors // utiliser « < » pour basculer en ordre décroissant Liste / Permuter \[i, j] (pivot / i) (pivot / j) :: custom ajouter [1] à [pivot / j v] fin ajouter [1] à [pivot / i v] fin Liste / Permuter \[i, j] (pivot / droite :: variables) (pivot / j) :: custom ajouter (pivot / gauche :: variables) à [pivot / gauche v] :: list ajouter (pivot / j) à [pivot / gauche v] :: list ajouter ((pivot / j) - [1]) à [pivot / droite v] :: list ajouter (pivot / droite :: variables) à [pivot / droite v] :: list fin fin
Fusion
Le tri fusion (de l'anglais "Merge Sort") consiste à diviser la liste par 2 jusqu'à trier des paires de celles, puis de faire fusionner les paires triées en utilisant le principe « diviser pour régner ».
définir Tri Fusion \[début, fin] (début) (fin) si <(début) = (fin)> alors stop [ce script v] // une liste de 1 élément est toujours triée fin Tri Fusion \[début, fin] (début) ((arrondi de (((début) + (fin)) / (2))) - (1)) Tri Fusion \[début, fin] (arrondi de (((début) + (fin)) / (2))) (fin) mettre [index i v] à (début) mettre [index j v] à (arrondi de (((début) + (fin)) / (2))) répéter jusqu'à ce que <<(index i) = (fin)> ou <(index j) > (fin)>> // on fusionne les listes triées si <(élément (index j) de [liste v]) < (élément (index i) de [liste v])> alors insérer (élément (index j) de [liste v]) en position (index i) de [liste v] ajouter [1] à [index j v] supprimer l'élément (index j) de [liste v] ajouter [1] à [index i v] sinon ajouter [1] à [index i v] fin fin
Voir aussi
- Algorithme de tri (Wikipédia)
- Qu'est ce qu'une liste ?