web-dev-qa-db-fra.com

Comment fonctionne Javascript sort ()?

Comment le code suivant trie-t-il ce tableau pour qu'il soit dans l'ordre numérique?

var array=[25, 8, 7, 41]

array.sort(function(a,b){
  return a - b
})

Je sais que si le résultat du calcul est ...

Moins de: "a" est trié pour être un indice inférieur à "b".
Zero: "a" et "b" sont considérés comme égaux et aucun tri n'est effectué.
Supérieur à 0: "b" est trié pour être un indice inférieur à "a".

La fonction de rappel de tri de tableau est-elle appelée plusieurs fois au cours du tri?

Si c'est le cas, j'aimerais savoir quels sont les deux nombres qui sont passés à la fonction à chaque fois. J'ai supposé qu'il prenait d'abord "25" (a) et "8" (b), suivi de "7" (a) et "41" (b), donc:

25 (a) - 8(b) = 17 (supérieur à zéro, donc triez "b" pour être un indice inférieur à "a"): 8, 25

7 (a) - 41 (b) = -34 (moins de zéro, donc triez "a" pour être un indice inférieur à "b": 7, 41

Comment les deux ensembles de nombres sont-ils ensuite triés l'un par rapport à l'autre?

Veuillez aider un débutant en difficulté!

75
cw84

La fonction de rappel de tri de tableau est-elle appelée plusieurs fois au cours du tri?

Oui

Si c'est le cas, je voudrais savoir quels sont les deux nombres passés à la fonction à chaque fois

Vous pourriez vous découvrir avec:

array.sort((a,b) => {
  console.log(`comparing ${a},${b}`);
  return a > b ? 1
               : a === b ? 0 
                         : -1;
});

MODIFIER

Voici la sortie que j'ai:

25,8
25,7
8,7
25,41
44
OscarRyz

L'interpréteur JavaScript a une sorte d'implémentation algorithme de tri intégrée. Il appelle la fonction de comparaison un certain nombre de fois pendant l'opération de tri. Le nombre d'appels de la fonction de comparaison dépend de l'algorithme particulier, des données à trier et de l'ordre dans lequel elles se trouvent avant le tri.

Certains algorithmes de tri fonctionnent mal sur des listes déjà triées car cela les amène à faire beaucoup plus de comparaisons que dans le cas typique. D'autres gèrent bien les listes pré-triées, mais ont d'autres cas où ils peuvent être "trompés" pour obtenir de mauvais résultats.

Il existe de nombreux algorithmes de tri couramment utilisés car aucun algorithme unique n'est parfait à toutes fins. Les deux plus utilisés pour le tri générique sont Quicksort et merge sort . Quicksort est souvent le plus rapide des deux, mais le tri par fusion a quelques propriétés Nice qui peuvent en faire un meilleur choix global. Le tri par fusion est stable , contrairement à Quicksort. Les deux algorithmes sont parallélisables, mais le fonctionnement du tri par fusion rend une implémentation parallèle plus efficace, toutes choses étant égales par ailleurs.

Votre interpréteur JavaScript particulier peut utiliser l'un de ces algorithmes ou autre chose entièrement. La norme ECMAScriptne spécifie pas quel algorithme une implémentation conforme doit utiliser. Il renie même explicitement le besoin de stabilité.

37
Warren Young

Des paires de valeurs sont comparées, une paire à la fois. Les paires comparées sont un détail d'implémentation - ne supposez pas qu'elles seront les mêmes sur tous les navigateurs. Le rappel peut être n'importe quoi (vous pouvez donc trier des chaînes ou des chiffres romains ou toute autre chose où vous pouvez trouver une fonction qui renvoie 1,0, -1).

Une chose à garder à l'esprit avec le tri de JavaScript est qu'il n'est pas garanti d'être stable.

10
Nosredna

La fonction de rappel de tri de tableau est-elle appelée plusieurs fois au cours du tri?

Oui, c'est exactement ça. Le rappel est utilisé pour comparer des paires d'éléments dans le tableau selon les besoins afin de déterminer dans quel ordre ils doivent être. Cette implémentation de la fonction de comparaison n'est pas atypique lorsqu'il s'agit d'un tri numérique. Détails sur la spécification ou sur certains autres plus lisibles sites.

5
T.J. Crowder

La fonction de rappel de tri de tableau est-elle appelée plusieurs fois au cours du tri?

Puisqu'il s'agit d'un tri de comparaison, étant donné N éléments, la fonction de rappel doit être invoquée en moyenne (N * Lg N) fois pour un tri rapide comme Quicksort . Si l'algorithme utilisé est quelque chose comme Bubble Sort , alors la fonction de rappel sera invoquée en moyenne (N * N) fois.

Le nombre minimum d'appels pour un tri de comparaison est (N-1) et c'est uniquement pour détecter une liste déjà triée (c'est-à-dire au début du tri par bulles si aucun échange ne se produit).

4
Adisak

exécutez ce code. Vous pouvez voir le processus de tri pas à pas exact du début à la fin.

var array=[25, 8, 7, 41]
var count = 1;
array.sort( (a,b) => { 
console.log(`${count++}). a: ${a} | b: ${b}`);
return a-b;
});
console.log(array);
0
Tinu Mathai