Quel algorithme la Array#sort()
fonction JavaScript utilise-t-elle? Je comprends que cela peut prendre toutes sortes d'arguments et de fonctions pour effectuer différents types de sortes, je suis simplement intéressé par l'algorithme utilisé par le tri vanilla.
javascript
algorithm
arrays
sorting
latortuga
la source
la source
Réponses:
Si vous regardez ce bogue 224128 , il semble que MergeSort est utilisé par Mozilla.
la source
Je viens de jeter un œil à la source WebKit (Chrome, Safari…) . Selon le type de tableau, différentes méthodes de tri sont utilisées:
Les tableaux numériques (ou tableaux de type primitif) sont triés à l'aide de la fonction de bibliothèque standard C ++
std::qsort
qui implémente une certaine variation de tri rapide (généralement introsort ).Les tableaux contigus de type non numérique sont chaîne et triés en utilisant mergesort, si disponible (pour obtenir un tri stable) ou
qsort
si aucun tri par fusion n'est disponible.Pour d'autres types (tableaux non contigus et vraisemblablement pour les tableaux associatifs) WebKit utilise soit le tri par sélection (qu'ils appellent le tri «min» ), soit, dans certains cas, il trie via une arborescence AVL. Malheureusement, la documentation ici est assez vague, vous devrez donc suivre les chemins de code pour voir pour quels types quelle méthode de tri est utilisée.
Et puis il y a des joyaux comme ce commentaire :
- Espérons simplement que quiconque «corrige» cela a une meilleure compréhension de l'exécution asymptotique que l'auteur de ce commentaire, et se rend compte que le tri radix a une description d'exécution légèrement plus complexe que simplement O (N).
(Merci à phsource d'avoir signalé l'erreur dans la réponse d'origine.)
la source
Il n'y a pas de projet d'exigence pour JS d'utiliser un algorthim de tri spécifique. Comme beaucoup l'ont mentionné ici, Mozilla utilise le tri par fusion.Cependant, dans le code source de Chrome v8, à partir d'aujourd'hui, il utilise QuickSort et InsertionSort, pour les tableaux plus petits.
Source de moteur V8
Depuis les lignes 807 - 891
Mise à jour À partir de 2018, V8 utilise TimSort, merci @celwell. La source
la source
La norme ECMAscript ne spécifie pas quel algorithme de tri doit être utilisé. En effet, différents navigateurs proposent différents algorithmes de tri. Par exemple, sort () de Mozilla / Firefox n'est pas stable (dans le sens de tri du mot) lors du tri d'une carte. Sort () d'IE est stable.
la source
Array.sort
; voir cette question .Après quelques recherches supplémentaires, il apparaît, pour Mozilla / Firefox, que Array.sort () utilise mergesort. Voir le code ici .
la source
Je pense que cela dépend de l'implémentation du navigateur auquel vous faites référence.
Chaque type de navigateur possède sa propre implémentation de moteur javascript, cela dépend donc. Vous pouvez vérifier les dépôts de code source pour Mozilla et Webkit / Khtml pour différentes implémentations.
Cependant, IE est une source fermée, vous devrez donc peut-être demander à quelqu'un de Microsoft.
la source
Depuis V8 v7.0 / Chrome 70, V8 utilise TimSort , l'algorithme de tri de Python. Chrome 70 est sorti le 13 septembre 2018.
Voir le post sur le blog de développement V8 pour plus de détails sur ce changement. Vous pouvez également lire le code source ou le patch 1186801 .
la source
La fonction Array.sort () de JavaScript possède des mécanismes internes pour sélectionner le meilleur algorithme de tri (QuickSort, MergeSort, etc.) sur la base du type de données des éléments du tableau.
la source
essayez ceci avec un tri rapide:
la source