¿Qué algoritmo usa la Array#sort()
función JavaScript ? Entiendo que puede tomar todo tipo de argumentos y funciones para realizar diferentes tipos de tipos, simplemente estoy interesado en qué algoritmo utiliza el tipo de vainilla.
javascript
algorithm
arrays
sorting
latortuga
fuente
fuente
Respuestas:
Si observa este error 224128 , parece que Mogeilla está utilizando MergeSort.
fuente
Acabo de echar un vistazo a la fuente WebKit (Chrome, Safari ...) . Dependiendo del tipo de matriz, se utilizan diferentes métodos de clasificación:
Las matrices numéricas (o matrices de tipo primitivo) se ordenan utilizando la función de biblioteca estándar C ++
std::qsort
que implementa alguna variación de clasificación rápida (generalmente introsort ).Las matrices contiguas de tipo no numérico se clasifican en cadena y se clasifican utilizando mergesort, si está disponible (para obtener una clasificación estable) o
qsort
si no hay una clasificación de fusión disponible.Para otros tipos (matrices no contiguas y presumiblemente para matrices asociativas) WebKit utiliza cualquier tipo de selección (que denominan clasificación "min" ) o, en algunos casos, se ordena a través de un árbol AVL. Desafortunadamente, la documentación aquí es bastante vaga, por lo que tendrías que rastrear las rutas de código para ver qué tipos de método de clasificación se utilizan realmente.
Y luego hay gemas como este comentario :
- Esperemos que quien realmente "arregle" esto comprenda mejor el tiempo de ejecución asintótico que el autor de este comentario, y se dé cuenta de que la clasificación de radix tiene una descripción de tiempo de ejecución un poco más compleja que simplemente O (N).
(Gracias a phsource por señalar el error en la respuesta original).
fuente
No hay un requisito de borrador para que JS use un algoritmo de clasificación específico. Como muchos han mencionado aquí, Mozilla usa el tipo de fusión. Sin embargo, en el código fuente v8 de Chrome, a partir de hoy, usa QuickSort e InsertionSort, para arreglos más pequeños.
Fuente del motor V8
Desde las líneas 807 - 891
Actualización A partir de 2018 V8 usa TimSort, gracias @celwell. Fuente
fuente
El estándar ECMAscript no especifica qué algoritmo de clasificación se utilizará. De hecho, diferentes navegadores presentan diferentes algoritmos de clasificación. Por ejemplo, sort () de Mozilla / Firefox no es estable (en el sentido de clasificación de la palabra) al ordenar un mapa. El tipo de IE () es estable.
fuente
Array.sort
; ver a esta pregunta .Después de un poco más de investigación, parece, para Mozilla / Firefox, que Array.sort () usa mergesort. Mira el código aquí .
fuente
Creo que eso dependerá de a qué implementación de navegador se refiera.
Cada tipo de navegador tiene su propia implementación de motor javascript, por lo que depende. Puede verificar los repositorios de código fuente para Mozilla y Webkit / Khtml para diferentes implementaciones.
Sin embargo, IE es de código cerrado, por lo que es posible que deba consultar a alguien en Microsoft.
fuente
A partir de V8 v7.0 / Chrome 70, V8 utiliza TimSort , el algoritmo de clasificación de Python. Chrome 70 fue lanzado el 13 de septiembre de 2018.
Consulte la publicación en el blog de desarrollo de V8 para obtener detalles sobre este cambio. También puede leer el código fuente o el parche 1186801 .
fuente
La función Array.sort () de JavaScript tiene mecanismos internos para seleccionar el mejor algoritmo de ordenación (QuickSort, MergeSort, etc.) en función del tipo de datos de los elementos de la matriz.
fuente
intente esto con una ordenación rápida:
fuente