91 votes

Comment la fonction de tri fonctionne-t-elle en JavaScript, ainsi que la fonction de comparaison ?

Comme nous l'avons déjà demandé, comment fonctionne la fonction de tri en JavaScript, avec la fonction compare fonction ? Si j'ai un tableau et que je fais array.sort(compare) Or, il est écrit dans le livre que si le compare les retours de fonction a-b (deux indices du tableau), cela fonctionne en fonction du fait que le résultat est supérieur à 0, inférieur à 0 ou égal à 0. Mais comment cela fonctionne-t-il exactement ? Je n'ai pas réussi à le comprendre.

0 votes

Qu'avez-vous besoin de savoir exactement ? Je suis presque sûr que l'algorithme de tri utilisé est spécifique à l'implémentation.

0 votes

La fonction de comparaison a un rapport avec le fonctionnement du tri, ne compare-t-elle pas simplement les deux variables et ne me donne-t-elle pas le résultat pour ces deux variables, comment le tableau entier est-il trié ?

0 votes

190voto

Flimzy Points 9245

La fonction "compare" doit prendre deux arguments, souvent appelés a y b . La fonction de comparaison renvoie ensuite 0, plus grand que 0 ou moins de 0, en fonction de ces valeurs, a y b .

  1. Retour supérieur à 0 si a est supérieur à b
  2. Retourne 0 si a égaux b
  3. Retourne moins de 0 si a est inférieur à b

Avec ces trois valeurs de retour et seulement deux arguments, il est possible d'écrire une fonction de comparaison capable de trier n'importe quel type de données d'entrée ou de structures de données complexes.

Ensuite, lorsque vous appelez sort(), avec votre fonction de comparaison personnalisée, la fonction de comparaison est appelée sur les paires de votre liste à trier, afin de déterminer l'ordre approprié.

Prenons un exemple simple... Supposons qu'il s'agisse seulement de trier des nombres, nous avons donc une fonction de comparaison très simple :

function compare(a,b) {
    return a - b;
}

La simple soustraction de b à a renverra toujours un résultat supérieur à zéro si a est plus grand que b, 0 s'ils sont égaux, ou inférieur à zéro si a est plus petit que b. Cette fonction répond donc aux exigences d'une fonction de comparaison.

Supposons maintenant qu'il s'agisse de notre liste de nombres à trier :

var numbers = [1,5,3.14];

Lorsque vous appelez numbers.sort(compare) en interne, il s'exécutera effectivement :

compare(1,5);     // Returns -4, a is less than b
compare(1,3.14);  // Return -2.14, a is less than b
compare(5,3.14);  // returns 1.86, a is greater than b

Si vous avez déjà effectué un tri manuel ou un classement alphabétique, vous avez fait exactement la même chose, probablement sans vous en rendre compte. Même si vous avez des dizaines ou des centaines d'éléments à comparer, vous ne comparez constamment que deux numéros (ou noms de famille d'auteurs, ou autres) à la fois. Si vous reprenez votre liste de trois nombres, vous commencerez par comparer les deux premiers :

  1. 1 est-il supérieur ou inférieur à 5 ? Inférieur, donc mettez ces deux nombres dans notre liste : 1,5
  2. 3,14 est-il supérieur ou inférieur à 1 ? Plus grand que, donc après 1 dans la nouvelle liste.
  3. 3,14 est-il supérieur ou inférieur à 5 dans notre nouvelle liste ? Inférieur à, donc avant 5. Notre nouvelle liste est maintenant [1,3.14,5]

Comme vous pouvez fournir votre propre fonction compare(), il est possible de trier des données arbitrairement complexes, et pas seulement des nombres.

38voto

nnnnnn Points 70578

Par défaut, le tableau sort() permet de trier les données par ordre alphabétique croissant. Si vous souhaitez trier dans un autre ordre, parce que votre tableau contient des nombres ou des objets, vous pouvez passer une fonction à la méthode sort() .

La fonction que vous transmettez prend deux paramètres, o un nombre négatif si le premier argument doit être trié avant le second (a < b) 0 si les arguments sont égaux (a==b) un nombre positif si le premier argument doit être trié après le second (a > b)

Aujourd'hui, Voici l'élément clé : la fonction que vous passez comme paramètre à sort() sera appelé à plusieurs reprises par sort() car il traite l'ensemble du tableau. sort() ne connaît pas le type de données des éléments du tableau et ne s'en préoccupe pas : chaque fois qu'il a besoin de savoir si l'élément A précède l'élément B, il appelle simplement votre fonction. Vous n'avez pas à vous préoccuper du type d'algorithme de tri utilisé en interne par sort() En effet, un navigateur peut utiliser un algorithme différent d'un autre, mais ce n'est pas grave car il suffit de lui fournir un moyen de comparer deux éléments de votre tableau.

Votre fonction peut avoir un if / else if / else pour décider du résultat à renvoyer, mais pour les nombres, il suffit de renvoyer (a-b) pour y parvenir, car le résultat de la soustraction sera -ve, 0 ou +ve et placera correctement les nombres dans l'ordre croissant. En retournant (b-a), vous les placerez dans l'ordre décroissant :

  var sortedArray = myArray.sort(function(a,b){
                                    return (a-b);
                                });

Si vous disposez d'un tableau d'objets et que vous souhaitez effectuer un tri sur une ou plusieurs propriétés particulières des objets, vous pouvez également le faire. En supposant, par exemple, que les objets se présentent sous ce format :

{ id : 1,
  name : "Fred",
  address : "12 Smith St",
  phone : "0262626262" }

Vous pouvez alors trier un tableau de ces objets en fonction de leur attribut "id" de la manière suivante :

var sortedArray = myArray.sort(function(a,b){
                                  return (a.id - b.id);
                              });

Vous pouvez également trier un tableau de ces objets en fonction de leur attribut "nom" (par ordre alphabétique), comme suit :

var sortedArray = myArray.sort(function(a,b){
                                   if (a.name < b.name)
                                      return -1;
                                   else if (a.name == b.name)
                                      return 0;
                                   else
                                      return 1;
                               });

Notez que dans mon dernier exemple, j'ai mis l'intégralité de la mention if / else if / else que j'ai mentionnée précédemment.

Dans l'exemple où vous triez des objets avec des propriétés multiples, vous pourriez étendre cette possibilité pour inclure un tri secondaire, c'est-à-dire (dans mon exemple) si les propriétés de nom sont égales, vous pourriez alors renvoyer une comparaison de, disons, la propriété de téléphone.

5voto

gamgam Points 51

Cette méthode utilise la syntaxe et les paramètres de la commande Array.sort (la fonction de comparaison et les options de tri), dont les paramètres sont définis comme suit :

compareFunction - une fonction de comparaison utilisée pour déterminer l'ordre de tri des éléments du tableau. Ce paramètre est facultatif. La fonction de comparaison doit être utilisée pour comparer les deux paramètres. A et B d'un élément donné, le résultat de compareFunction peut avoir une valeur négative, 0 ou une valeur positive :

Si la valeur de retour est négative, cela signifie que A apparaît avant B dans la séquence triée. Si la valeur de retour est égale à 0, cela signifie que A et B ont le même ordre de tri. Si la valeur de retour est positive, cela signifie que A apparaît après B dans la séquence triée.

4voto

Nous pouvons simplifier pour le tri dans ordre normal y ordre inverse

premier paramètre es a .

deuxième paramètre es b .

function compare(a, b) {
  //  make some operations to calculate these variables as true or false
  //     weNeedToMoveFirstParameterInPositiveDirection
  //     weDoNotNeedToMove
  //     weNeedToMoveFirstParameterInNegativeDirection

  // just think about numerical axis <------(-1)---(0)---(1)------>
  if (weNeedToMoveFirstParameterInPositiveDirection) return 1;  
  if (weDoNotNeedToMove) return 0; 
  if (weNeedToMoveFirstParameterInNegativeDirection) return -1;  
}

2voto

La méthode de tri seule traite les nombres comme des chaînes de caractères, donc si le tableau est composé de chaînes de caractères, vous n'avez pas besoin de la fonction de comparaison. Mais s'il s'agit d'un tableau de nombres, vous avez besoin de la fonction de comparaison pour modifier le comportement de la méthode de tri.

ex1 :chaînes de caractères

var animals = ["Horse", "Cat", "Tiger", "Lion"];  
animals.sort();

ex2 : chiffres

var marks = [70, 90, 60, 80 ];  
marks.sort(function(a, b){return a > b}); //ascending , a < b descending .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X