sort descending array java arrays sorting java-8

java - descending - Diferencia entre Arrays.sort() y Arrays.parallelSort()



java sort list (7)

Arrays.parallelSort ():

El método utiliza un valor de umbral y cualquier matriz de tamaño menor que el valor de umbral se ordena utilizando la API de Arrays # sort () (es decir, la clasificación secuencial). Y el umbral se calcula teniendo en cuenta el paralelismo de la máquina, el tamaño de la matriz y se calcula como:

private static final int getSplitThreshold(int n) { int p = ForkJoinPool.getCommonPoolParallelism(); int t = (p > 1) ? (1 + n / (p << 3)) : n; return t < MIN_ARRAY_SORT_GRAN ? MIN_ARRAY_SORT_GRAN : t; }

Una vez que se decide si ordenar la matriz en paralelo o en serie, ahora es cómo decidir cómo dividir la matriz en varias partes y luego asignar cada parte a una tarea Fork / Join que se encargará de clasificarla y luego otra Fork / Únase a la tarea que se encargará de fusionar los arreglos ordenados. La implementación en JDK 8 utiliza este enfoque:

  • Divide la matriz en 4 partes.

  • Ordena las dos primeras partes y luego fusionalas.

  • Ordena las siguientes dos partes y luego fusionalas. Y los pasos anteriores se repiten recursivamente con cada parte hasta que el tamaño de la parte a ordenar no sea menor que el valor de umbral calculado anteriormente.

También puedes leer los detalles de implementación en el Javadoc

El algoritmo de clasificación es una combinación de clasificación paralela que divide la matriz en subarreglas que se clasifican y luego se combinan. Cuando la longitud de la sub-matriz alcanza una granularidad mínima, la sub-matriz se ordena usando el método Arrays.sort apropiado. Si la longitud de la matriz especificada es menor que la granularidad mínima, entonces se ordena utilizando el método Arrays.sort apropiado. El algoritmo requiere un espacio de trabajo no mayor que el tamaño del rango especificado de la matriz original. El grupo común de ForkJoin se utiliza para ejecutar cualquier tarea paralela.

Array.sort ():

Esto utiliza la ordenación de fusión O la ordenación de Tim debajo para ordenar los contenidos. Todo esto se hace de forma secuencial, aunque la ordenación por combinación utiliza la técnica de dividir y conquistar, todo se hace de forma secuencial.

Source

Estaba pasando por las características Java 8 , mencionadas here . No se pudo entender lo que hace parallelSort() exactamente. ¿Puede alguien explicar cuál es la diferencia real entre sort() y parallelSort() ?


Desde este link

Las implementaciones de clasificación actuales proporcionadas por el Java Collections Framework (Collections.sort y Arrays.sort) realizan la operación de clasificación de forma secuencial en el hilo de llamada. Esta mejora ofrecerá el mismo conjunto de operaciones de clasificación proporcionadas actualmente por la clase Arrays, pero con una implementación paralela que utiliza el marco Fork / Join. Estas nuevas API siguen siendo sincrónicas con respecto al subproceso de llamada, ya que no pasará de la operación de clasificación hasta que se complete la clasificación en paralelo.


En pocas palabras, parallelSort utiliza varios subprocesos. Este Source tiene mucho más detalle si realmente quieres saber.


La ordenación paralela utiliza el subprocesamiento (cada subproceso obtiene una parte de la lista y la ordena en paralelo. Más adelante, estas partes ordenadas se fusionan en un resultado).

Es más rápido cuando hay muchos elementos en la colección. La sobrecarga para la paralelización se vuelve tolerablemente pequeña en arreglos más grandes, pero es grande para los más pequeños.

Eche un vistazo a esta tabla (por supuesto, los resultados dependen de la CPU, la cantidad de núcleos, los procesos en segundo plano, etc.):

Tomado de este enlace: http://www.javacodegeeks.com/2013/04/arrays-sort-versus-arrays-parallelsort.html


Las diferencias clave entre ambos algoritmos son las siguientes:

1. Arrays.sort () : es una ordenación secuencial.

  • La API utiliza un solo hilo para la operación.
  • La API toma un poco más de tiempo para realizar la operación.

2. Arrays.ParallelSort () : es una ordenación paralela.

La API utiliza múltiples hilos.

  • La API toma menos tiempo en comparación con Ordenar ().

Para obtener más resultados, todos tenemos que esperar a JAVA 8, supongo !! saludos !!


Puede consultar Javadoc , que explica que el algoritmo utiliza varios subprocesos si la matriz es lo suficientemente grande:

El algoritmo de clasificación es una combinación de clasificación paralela que divide la matriz en subarreglas que se clasifican y luego se combinan. Cuando la longitud de la sub-matriz alcanza una granularidad mínima, la sub-matriz se ordena usando el método Arrays.sort apropiado. [...] El ForkJoin común de ForkJoin se utiliza para ejecutar cualquier tarea paralela.


Array.sort(myArray);

Ahora puedes usar -

Arrays.parallelSort(myArray);

Esto dividirá automáticamente la colección objetivo en varias partes, que se ordenarán de forma independiente en una serie de núcleos y luego se agruparán de nuevo. La única advertencia aquí es que cuando se invoca en entornos con múltiples subprocesos, como un contenedor web ocupado, los beneficios de este enfoque comenzarán a disminuir (en más del 90%) debido al costo del aumento de los cambios de contexto de la CPU.

Fuente- link