2011-12-21 16 views
7

que he visto este tipo de función funciona bien:Lo que realmente sucede en Javascript Ordenar

var arr = [1,5,3,7,8,6,4,3,2,3,3,4,5,56,7,8,8]; 


console.log(arr.sort(
    function(a,b) { 
     return a - b; 
    } 
    )); 

Pero no entienden realmente la mecánica de esta pequeña función. Cuando se comparan ayb, ¿qué números de la matriz realmente se comparan? Si, por ejemplo, recogió los primeros dos números 1 y 5, la función devolverá -4. ¿Qué significa eso para el orden de clasificación? ¿O es solo el valor booleano negativo? Incluso si lo es, ¿cómo sucede realmente el género?

+0

Para referencia: especificación ['Array.prototype.sort'] (http://ecma262-5.com/ELS5_HTML.htm#Section_15.4.4.11). –

Respuesta

7

Básicamente, el tipo funciona comparando dos elementos a la vez. Una comparación es más que un booleano; tiene tres opciones: menor que, igual o mayor que. En JavaScript, estos tres valores están representados por n < 0, 0 y n> 0 respectivamente.

En otras palabras, los números negativos significan a < b; 0 significa a = b y positivo significa a > b.

Para responder a la pregunta más amplia: hay algunos algoritmos relativamente rápidos para ordenar una lista mediante la comparación de sus elementos. El más popular es Quicksort; sin embargo, Quicksort no es estable, por lo que algunos motores (de Firefox con seguridad) usan un algoritmo diferente. Un tipo estable simple es Mergesort.

Los algoritmos de clasificación son a menudo algunos de los primeros algoritmos analizados en las clases de intro CS porque son simples pero aún interesantes y no lo suficientemente triviales como para ilustrar cómo analizar algoritmos en general. Deberías leer sobre ellos por este motivo, y simplemente porque son geniales.

poco al azar a un lado:

También podría imaginar el uso de un tipo especial (como una enumeración) para este tipo de cosas. La función de comparación podría devolver LT, GT o EQ según corresponda, por ejemplo. Sin embargo, en un lenguaje dinámico como JavaScript, es mucho más fácil usar números. En idiomas más obsesionados con los tipos (como Haskell :)), usar un tipo de orden especial tiene más sentido.

+0

De acuerdo, pasó por la entrada Mergesort Wikipedia y tiene sentido (en términos generales). Pero si quería echar un vistazo a cómo se ha escrito la implementación de la función de ordenación en Javascript, ¿cómo puedo hacerlo? –

+0

@Capex: JavaScript no utiliza ningún algoritmo de ordenación, es decir, no hay ninguna especificación que diga "debe usar sort de burbuja" o lo que sea. Las diferentes implementaciones de Javascript (en diferentes navegadores) pueden usar diferentes algoritmos de clasificación. Pero el método de ordenación de matriz con los parámetros a y b seguirá siendo el mismo para los programadores de Javascript porque simplemente proporciona una forma para que el algoritmo subyacente compare dos valores dados. – nnnnnn

+1

Creo que el problema aquí es que la función de clasificación incorporada probablemente * no * esté escrita en JavaScript; sospecho que la mayoría de los motores lo implementan en código nativo por razones de rendimiento. Puedes ver el ordenamiento de webkit [aquí] (http://svn.webkit.org/repository/webkit/trunk/Source/JavaScriptCore/runtime/ArrayPrototype.cpp) si te desplazas un poco hacia abajo. Si solo quiere un algoritmo de clasificación en JavaScript, [aquí] (http://en.literateprograms.org/Merge_sort_ (JavaScript)) es un alfabetizado que tiene muchos comentarios. –

1

Usted tiene 3 opciones menos (-), igual (==) y más (+):

  • menos: si a - b < 0 continuación a antes b
  • es igual: no cuestión
  • más: si a - b > 0 continuación b antes a

ver este hilo para más información: Javascript Array.sort implementation?

0

Al pasar una función a Array.sort, se usará para comparar a y b.Cómo van a ser ordenados depende de lo que devuelve la función:

  • Si result < 0, entonces a viene antes b;
  • Si result == 0, entonces a y b ya están en el orden correcto;
  • Si result > 0, entonces a viene después de b.

Si se llama a sort sin un argumento, los elementos se convierten en cadenas y se comparan alfabéticamente.

Por cierto, qué algoritmo sort utiliza depende completamente de la implementación del navegador. Podría ser una ordenación rápida, tipo de fusión o cualquier otra cosa. El estándar ECMAScript no especifica ningún requisito en este sentido.

Cuestiones relacionadas