2011-11-02 3 views
18

В стандартной библиотеке Java существует ли метод, позволяющий сортировать ArrayList на месте, то есть используя O(1) дополнительное хранилище?Java: сортировка ArrayList на месте

Collections.sort(List<T>) не выполняет это требование, поскольку он

сбрасывает указанный список в массив, сортирует массив и итерацию по списку перезапуске каждый элемент из соответствующей позиции в массиве.

Если в стандартной библиотеке нет ничего, какие сторонние библиотеки могут быть использованы для этого?

ответ

11

Вы можете извлечь базовый массив (например, отражение) и выполнить массив Arrays.sort (array, 0, list.size()) на нем.

Java 7 не копирует массив в массиве Arrays.sort() перед сортировкой массива. В Java 6 это означает, что Collections.sort() в Java 6 фактически копирует базовый массив TWICE для выполнения сортировки.

+0

Единственное, что это берет копию массива, и поэтому использует O (n) дополнительное хранилище в соответствии с Collections.sort. – Adamski

+0

В Java 7 не требуется копия. Я не проверил Java 6. –

+0

Интересно. Я действительно очень удивлен, что они изменили поведение, чтобы вернуть базовый массив; может представить, что это вызовет множество тонких ошибок для людей, обновляющихся с Java 6. – Adamski

0

Просто, нет. Collections.sort() был создан для сортировки, кажется, что вы должны реализовать свои собственные. Для списков я использовал бы Bubblesort, потому что он просто обменивает два соседних элемента, что можно сделать очень просто без изменения Ковши.

+14

Пожалуйста, не используйте BubbleSort! Это ужасно: O (n^2) – McK

1

Collections.sort() был создан для работы с любой реализацией списка, и поэтому он не работает на месте (слияние LinkedList на месте сложно и жертвует стабильностью).

Если вы действительно обеспокоены сортировкой на месте, вам придется развернуть свою собственную функцию. Это не стоит вашего времени, если только ваш список очень длинный.

Arrays.sort(Object[]) делает то же самое, и слиянием вызывается внутренне Collections.sort() (по крайней мере, в OpenJDK)

+1

вы можете сделать копирование пасты описанного здесь heapsort, используя ArrayList вместо массива: [link] http://en.wikibooks.org/wiki/Algorithm_Implementation/Sorting/Heapsort) – soulcheck

+0

+1 для копий-макарон –

Смежные вопросы