Алгоритмы сортировки
Сортировка — базовая задача CS. QuickSort (1959) работает за O(n log n), BubbleSort за O(n²). TimSort используется в Python и Java по умолчанию.
Алгоритмы сортировки
QuickSort — быстрая сортировка
Алгоритм «разделяй и властвуй» с опорным элементом (pivot). Средняя сложность O(n log n), худшая O(n²). Изобретён Хоаром (1960). Partition перегруппирует элементы: меньше pivot слева, больше справа.
MergeSort — сортировка слиянием
Рекурсивное деление массива пополам до 1 элемента, затем слияние отсортированных половин. Гарантированная сложность O(n log n). Стабильная. Требует O(n) дополнительной памяти. Фон Нейман, 1945.
HeapSort — пирамидальная сортировка
Построение кучи (heap) из массива, затем извлечение максимума в конец. Сложность O(n log n) всегда. На месте (in-place), нестабильная. Введена Уильямсом (1964). Используется в priority queue.
Counting Sort — сортировка подсчётом
Подсчёт частоты каждого значения в массиве, затем восстановление. Линейная сложность O(n + k), где k — диапазон значений. Стабильная. Применима для целых чисел в ограниченном диапазоне.
Insertion Sort — сортировка вставками
Построение отсортированной части массива слева направо. Каждый элемент вставляется на своё место. Сложность O(n²), но эффективна для малых массивов (< 10). Адаптивная: O(n) на почти отсортированных.
Selection Sort — сортировка выбором
Поиск минимума в неотсортированной части, обмен с первым элементом. Повтор для остальных. Сложность O(n²) всегда. Минимальное число обменов (n-1). Нестабильная, проста для понимания.
Bubble Sort — сортировка пузырьком
Попарное сравнение соседних элементов, «всплытие» максимума вправо. Сложность O(n²), неэффективна для больших данных. Стабильная. Адаптивная с ранним выходом. Учебная цель.
TimSort — гибридная сортировка
Комбинация MergeSort и InsertionSort, используется в Python и Java. Делит массив на runs, сортирует вставками, сливает. Стабильная, O(n log n), адаптивная к частично отсортированным данным. Тим Питерс, 2002.
Быстрая сортировка (QuickSort)
Алгоритм "разделяй и властвуй" (1960, Тони Хоар). Выбирает опорный элемент, разбивает массив на меньшие/большие. Средняя сложность O(n log n), худшая O(n²). Самый быстрый на практике.
Сортировка слиянием (MergeSort)
Стабильный алгоритм "разделяй и властвуй" (1945, Джон фон Нейман). Делит массив пополам, сортирует рекурсивно, сливает. Гарантированно O(n log n), требует O(n) памяти.
Пирамидальная сортировка (HeapSort)
Использует структуру двоичной кучи (1964, Дж. Уильямс). Строит max-heap, извлекает максимумы. O(n log n) гарантированно, in-place, но не стабильная. Используется в introsort.
Сортировка пузырьком
Простейший алгоритм: сравнивает соседние элементы, меняет местами. O(n²) всегда. Учебный пример неэффективного алгоритма, на практике не используется для больших данных.
Сортировка вставками
Вставляет каждый элемент в отсортированную часть. O(n²) в среднем, но O(n) для почти отсортированных данных. Стабильная, in-place. Эффективна для малых массивов (< 50 элементов).