#java #sorting #arraylist
#java #сортировка #список массивов
Вопрос:
Существует ли в стандартной библиотеке Java метод, который позволил бы сортировать ArrayList
на месте, т. Е. Использовать O(1)
дополнительное хранилище?
Collections.sort(List<T>)
не выполняет это требование, поскольку оно
сбрасывает указанный список в массив, сортирует массив и выполняет итерацию по списку, сбрасывая каждый элемент из соответствующей позиции в массиве.
Если в стандартной библиотеке ничего нет, какие сторонние библиотеки можно использовать для этого?
Ответ №1:
Вы можете извлечь базовый массив (например, отражение) и выполнить для него Arrays.sort(array, 0, list.size()) .
Java 7 не копирует массив в Arrays.sort() перед сортировкой массива. В Java 6 это так, что означает, что Collections.sort() в Java 6 фактически копирует базовый массив ДВАЖДЫ для выполнения сортировки.
Комментарии:
1. Единственное, что это берет копию массива и поэтому использует O (n) дополнительного хранилища в соответствии с Collections.sort.
2. В Java 7 он не принимает копию. Я не проверял Java 6.
3. Интересно. На самом деле я очень удивлен, что они изменили поведение, чтобы вернуть базовый массив; могу себе представить, что это вызовет множество мелких ошибок у людей, обновляющихся с Java 6.
4. Arrays.sort() ничего не возвращает. Вопрос в том, копирует ли он массив перед его сортировкой.
5. В Java 8
Collections.sort
вызываетsort
список, так что это зависит от реализации списка.ArrayList
вызываетArrays.sort
его элемент array, так что он все еще на месте.
Ответ №2:
Collections.sort()
был создан для работы с любой реализацией списка, и именно поэтому он не работает на месте (объединение LinkedList на месте затруднено и снижает стабильность).
Если вы действительно беспокоитесь о сортировке на месте, вам придется развернуть свою собственную функцию сортировки. На самом деле это не стоит вашего времени, если ваш список не очень длинный.
Arrays.sort(Object[])
выполняет ту же сортировку слиянием и вызывается внутренне Collections.sort()
(по крайней мере, в openjdk)
Комментарии:
1. вы можете выполнить копирование макета из heapsort, описанного здесь, используя ArrayList вместо array: [ссылка] en.wikibooks.org/wiki/Algorithm_Implementation/Sorting/Heapsort )
Ответ №3:
Начиная с Java 8 List
, интерфейс имеет void sort(Comparator<? super E> c)
API по умолчанию, с помощью которого вы можете сортировать экземпляр на месте.
Список должен быть изменяемым, итерируемым, а его элементы должны быть сопоставимы друг с другом.