С учетом
int[] array = ... ;
Чтобы отсортировать по возрастанию, просто сделайте
Arrays.sort(array);
Вот хороший способ сортировки по убыванию:
Arrays.setAll(array, i -> ~array[i]);
Arrays.sort(array);
Arrays.setAll(array, i -> ~array[i]);
Это немного медленнее, чем сортировка по возрастанию, а затем обратный массив; он должен сделать дополнительный проход по массиву. Во время выполнения преобладает сортировка массива любого значительного размера, поэтому вряд ли это будет заметно.
Это работает, выполняя побитовое дополнение значений int до и после сортировки. Это обеспечивает точное, без потерь изменение порядка всех возможных значений int. Чтобы увидеть это, вы должны понимать, что Java-интты используют представление two'splement . Подумайте, должны ли ints иметь только три бита. Все значения будут следующими:
100 101 110 111 000 001 010 011
-4 -3 -2 -1 0 1 2 3
MIN_VALUE ^
Оператор побитового дополнения ~
инвертирует каждый бит. Из проверки вы можете видеть, что это отражает таблицу о точке поворота между -1 и 0, поэтому -4 становится 3, -3 становится 2 и т. Д. Кроме того, другое дополнение восстановит исходное значение. Таким образом, сортировка по дополнительным значениям по возрастанию является сортировкой по исходным значениям по убыванию.
Обратите внимание, что это отличается от отрицания -
, которое здесь не работает правильно. Он отражает таблицу при ноль, поэтому отрицание нуля равно нулю, отрицание -1 равно 1 и т. Д. Это асимметрично, поскольку отрицание MIN_VALUE равно MIN_VALUE. Таким образом, использование отрицания при попытке выполнить сортировку по убыванию не работает.
Наконец, бокс и использование Comparator работает, но он значительно медленнее, и он выделяет отдельный объект для (почти) каждого значения int. Я рекомендую избегать бокса.