2009-09-29 18 views
54

¿Cómo se ordena el siguiente código para que este conjunto esté en orden numérico?¿Cómo funciona Javascript's sort()?

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

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

Yo sé que si el resultado del cálculo es ...

Menos de 0: "a" se ordena a ser un índice menor que "b".
Cero: "a" y "b" se consideran iguales, y no se realiza ninguna clasificación.
Mayor que 0: "b" está clasificado como un índice más bajo que "a".

¿La función de devolución de llamada de matriz se llama muchas veces durante el transcurso del tipo?

Si es así, me gustaría saber qué dos números pasan a la función cada vez. Supuse que primero tomó "25" (a) y "8" (b), seguido de "7" (a) y "41" (b), entonces:

25 (a) - 8 (b) = 17 (mayor que cero, por lo que el tipo "b" es un índice menor que "a"): 8, 25

7 (a) - 41 (b) = -34 (menos de cero, entonces ordene " a" a ser un índice menor que 'b':?! 7, 41

¿Cómo están los dos conjuntos de números a continuación, ordenados en relación uno con otro

por favor, ayudar a un novato que lucha

+1

¡Espero que esto tenga un sentido confuso! – cw84

Respuesta

32

¿La función de devolución de llamada de ordenación se llama varias veces durante el transcurso del tipo?

Si es así, me gustaría saber qué dos números se pasan a la función cada vez

Se puede averiguar su auto con:

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

E DIT

Ésta es la salida Tengo:

25,8 
25,7 
8,7 
25,41 
+7

en lugar de hacer un console.log para firebug o html elemento DIV .innerHTML + = "comparando" + a + "," + b + "\ n"; – Joshua

+0

@Joshua: Definitivamente – OscarRyz

+2

Recuerda que este es un sitio wiki y podemos editar las respuestas de otros para que sean mejores :) –

3

Es el arra ¿Cómo se ordena la función de devolución de llamada muchas veces durante el curso del género?

Sí, eso es exactamente. La devolución de llamada se usa para comparar pares de elementos en la matriz según sea necesario para determinar en qué orden deberían estar. Esa implementación de la función de comparación no es atípica cuando se trata de una ordenación numérica. Detalles en the spec o en some otros sitios more readable.

34

El intérprete de JavaScript tiene incorporado algún tipo de implementación de sort algorithm. Llama a la función de comparación varias veces durante la operación de clasificación. La cantidad de veces que se llama a la función de comparación depende del algoritmo particular, los datos que se ordenarán y el orden en que se encuentra antes del ordenamiento.

Algunos algoritmos de clasificación funcionan mal en las listas ya ordenadas porque les hace hacer muchas más comparaciones que en el caso típico. Otros se adaptan bien a las listas pre-ordenadas, pero tienen otros casos en los que pueden ser "engañados" para que rindan mal.

Hay muchos algoritmos de clasificación en uso común porque ningún algoritmo es perfecto para todos los propósitos. Los dos más utilizados para la clasificación genérica son Quicksort y merge sort. Quicksort suele ser el más rápido de los dos, pero el tipo de combinación tiene algunas propiedades agradables que pueden hacer que sea una mejor elección general. El tipo de fusión es stable, mientras que Quicksort no lo es. Ambos algoritmos son paralelizables, pero la manera en que merge sort funciona hace que una implementación paralela sea más eficiente, siendo todo lo demás igual.

Su intérprete de JavaScript particular puede usar uno de esos algoritmos o algo completamente diferente. El estándar ECMAScriptdoes not specify which algorithm debe usar una implementación conforme. Incluso niega explícitamente la necesidad de estabilidad.

+1

FWIW, Quicksort básico es uno de los algoritmos que se puede "engañar" para que funcione mal. En la forma simple, tiene un rendimiento O (N^2) para las listas que ya están ordenadas o invertidas exactamente. La mayoría de los algoritmos Quicksort de la biblioteca tienen una serie de optimizaciones no obvias que ayudan a evitar estos escenarios comunes del peor de los casos. – Adisak

+2

JavaScriptCore realmente utiliza un árbol AVL para la clasificación, ya que es necesario comportarse de manera determinista frente a las funciones del comparador que modifican la matriz que se está ordenando. – olliej

9

pares de valores se comparan, un par a la vez. Los pares que se comparan son un detalle de implementación: no asuma que serán los mismos en todos los navegadores. La devolución de llamada puede ser cualquier cosa (por lo que puede ordenar cadenas o números romanos o cualquier otra cosa donde se le ocurra una función que devuelva 1,0, -1).

Una cosa a tener en cuenta con el género de JavaScript es que no se garantiza que sea estable.

2

¿La función de devolución de llamada de matriz se llama muchas veces durante el transcurso del tipo?

Como se trata de una especie de comparación, dado N elementos, la función de devolución de llamada debe ser invocado en (N * N) Lg tiempos promedio para un tipo rápido, como Quicksort. Si el algoritmo utilizado es algo así como Bubble Sort, la función de devolución de llamada se invocará en promedio (N * N) veces.

El número mínimo de invocaciones para una clasificación de comparación es (N-1) y eso es solo para detectar una lista ya ordenada (es decir, antes de la clasificación de burbuja si no se producen intercambios).