Какой алгоритм сортировки используется в методе Collections.sort() по умолчанию?

«Какой алгоритм сортировки используется в методе Collections.sort() по умолчанию?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Начиная с Java 7, метод Collections.sort()List.sort()) для сортировки объектов использует TimSort — гибридный, устойчивый алгоритм сортировки.

Характеристики TimSort:

  • Гибрид: Комбинация сортировки слиянием (MergeSort) и сортировки вставками (InsertionSort).
  • Устойчивость (Stable): Не меняет порядок равных элементов, что важно при сортировке по нескольким ключам.
  • Сложность: O(n log n) в худшем и среднем случае, O(n) в лучшем (для уже частично отсортированных данных).
  • Оптимизация: Эффективно работает с реальными, часто частично упорядоченными данными.

Пример:

import java.util.*;

List<String> names = Arrays.asList("Zoe", "Alice", "Bob", "Charlie");
Collections.sort(names); // Используется TimSort
System.out.println(names); // [Alice, Bob, Charlie, Zoe]

// С компаратором также используется TimSort
Collections.sort(names, Comparator.reverseOrder());

Важное отличие: Метод Arrays.sort() для массивов примитивов (например, int[]) использует Dual-Pivot Quicksort. Для массивов объектов также используется TimSort.

int[] numbers = {5, 1, 4, 2};
Arrays.sort(numbers); // Dual-Pivot Quicksort для примитивов

String[] words = {"Zoe", "Alice"};
Arrays.sort(words); // TimSort для объектов