2011-11-02 18 views
18

En la biblioteca estándar de Java, ¿hay algún método que permita ordenar un ArrayList en su lugar, es decir, utilizando el almacenamiento adicional O(1)?Java: ordenar una ArrayList en su lugar

Collections.sort(List<T>) no cumple este requisito, ya que

vuelca la lista especificada en una matriz, ordena la matriz, e itera sobre la lista de restablecer cada elemento de la posición correspondiente en la matriz.

Si no hay nada en la biblioteca estándar, ¿qué bibliotecas de terceros se pueden usar para hacer esto?

Respuesta

11

Puede extraer la matriz subyacente (por ejemplo, reflejo) y realizar Arrays.sort (matriz, 0, list.size()) en ella.

Java 7 no copia la matriz en Arrays.sort() antes de ordenar la matriz. En Java 6 sí lo hace, lo que significa que Collections.sort() en Java 6 en realidad copia la matriz subyacente DOS VECES para realizar el ordenamiento.

+0

Lo único que hace falta es una copia de la matriz y, por lo tanto, usa O (n) almacenamiento adicional según Collections.sort. – Adamski

+0

En Java 7 no toma una copia. No he comprobado Java 6. –

+0

Interesante. En realidad, estoy bastante sorprendido de que hayan cambiado el comportamiento para devolver el conjunto subyacente; Me imagino que esto causaría muchos errores sutiles para las personas que actualicen desde Java 6. – Adamski

0

Simplemente, no. Collections.sort() se creó para ordenar, parece que tiene que implementar el suyo. Para las listas, utilizaría Bubblesort, ya que solo intercambia dos elementos vecinos, lo que se puede hacer muy simple sin cambiar los intervalos.

+14

Por favor, no use BubbleSort! Es terrible: O (n^2) – McK

1

Collections.sort() se hizo para trabajar con cualquier implementación de lista, y es por eso que no está funcionando en su lugar (fusionar LinkedList en su lugar es difícil y sacrifica la estabilidad).

Si está realmente preocupado por la clasificación en el lugar, tendrá que implementar su propia función de clasificación. Realmente no vale la pena su tiempo a menos que su lista sea muy larga.

Arrays.sort(Object[]) hace lo mismo mergesort y se llama internamente por Collections.sort() (al menos en OpenJDK)

+1

puede copiar pasta del heapsort que se describe aquí, usando ArrayList en lugar de array: [link] http://en.wikibooks.org/wiki/Algorithm_Implementation/Sorting/Heapsort) – soulcheck

+0

+1 para copy-pasta –

Cuestiones relacionadas