Перечислите основные алгоритмы сортировки и их временную сложность

Ответ

Существует множество алгоритмов сортировки, различающихся по эффективности, требованиям к памяти и стабильности. Вот основные из них:

  1. Сортировка пузырьком (Bubble Sort)

    • Принцип: Многократно проходит по массиву, сравнивая соседние элементы и меняя их местами, если они стоят в неверном порядке. Самые "тяжелые" элементы "всплывают" в конец.
    • Сложность: O(n²)
    • Особенности: Прост для понимания, но крайне неэффективен на больших данных.
  2. Сортировка выбором (Selection Sort)

    • Принцип: Находит минимальный элемент в неотсортированной части массива и ставит его в начало.
    • Сложность: O(n²)
    • Особенности: Нестабильный, но делает минимальное количество обменов.
  3. Быстрая сортировка (Quick Sort)

    • Принцип: Использует подход "разделяй и властвуй". Выбирается опорный элемент (pivot), и массив делится на две части: элементы меньше опорного и элементы больше опорного. Процесс рекурсивно повторяется для каждой части.
    • Сложность: В среднем O(n log n), в худшем случае O(n²).
    • Особенности: Один из самых быстрых алгоритмов на практике, но нестабильный.
  4. Сортировка слиянием (Merge Sort)

    • Принцип: Также использует "разделяй и властвуй". Массив рекурсивно делится пополам до тех пор, пока не останутся единичные элементы, а затем отсортированные части сливаются обратно.
    • Сложность: O(n log n) в любом случае.
    • Особенности: Стабильный, но требует дополнительной памяти O(n) для слияния.
  5. Timsort

    • Принцип: Гибридный алгоритм, сочетающий сортировку слиянием и сортировку вставками. Эффективно работает на частично отсортированных данных.
    • Сложность: O(n log n) в худшем случае, O(n) в лучшем.
    • Особенности: Это стандартный алгоритм сортировки в Python (list.sort(), sorted()).
Алгоритм Средняя сложность Худшая сложность Доп. память Стабильность
Пузырьковая O(n²) O(n²) O(1) Да
Выбором O(n²) O(n²) O(1) Нет
Быстрая O(n log n) O(n²) O(log n) Нет
Слиянием O(n log n) O(n log n) O(n) Да
Timsort O(n log n) O(n log n) O(n) Да