Алгоритмы сортировки и поиска: Bubble Sort, Selection Sort и бинарный поиск
Сортировка обменами (пузырек), сортировка выбором, линейный поиск O(n), бинарный поиск O(log n) в упорядоченном массиве, сравнительный анализ эффективности.
Сортировка — это процесс упорядочивания элементов массива по определенному критерию (по возрастанию или по убыванию величины ключа).
Пузырьковая сортировка (Bubble Sort) — самый наглядный и простой алгоритм сортировки:
• Принцип: алгоритм многократно проходит по массиву слева направо. На каждом шаге сравниваются два СОСЕДНИХ элемента: a[j] и a[j+1];
• Если левый элемент больше правого (), они меняются местами (всплытие большего элемента в конец);
• В результате первого полного прохода самый большой элемент массива гарантированно «всплывает» на самую последнюю позицию (как пузырек воздуха в воде);
• На втором проходе второй по величине элемент встает на предпоследнее место, и так далее за проход массив оказывается полностью отсортирован.
Схема попарных сравнений алгоритма Bubble Sort
Bubble Sort (Пузырек)
O(n²)
Сортировка выбором (Selection Sort) работает по другому наглядному принципу:
1. На первом проходе находится минимальный элемент во всем массиве от 0 до n-1;
2. Найденный минимум меняется местами с первым элементом a[0];
3. На втором проходе ищется минимум в оставшейся неотсортированной части от 1 до n-1 и меняется местами с a[1];
4. Процесс повторяется n-1 раз.
Преимущество сортировки выбором перед пузырьковой: число перестановок (обменов) минимально и составляет ровно , хотя число сравнений остается квадратичным .
Selection Sort
Поиск — это операция нахождения индекса элемента с заданным значением (ключом) в массиве.
1. Линейный поиск (Linear Search):
Последовательный просмотр всех элементов массива от первого до последнего: for x in a: if x == target: return True. Работает в любом массиве (даже неотсортированном). Время работы в худшем случае прямо пропорционально размеру массива: . Для массива из 1 миллиарда элементов потребуется 1 миллиард сравнений;
2. Бинарный поиск (Binary Search / Метод половинного деления):
КРИТИЧЕСКОЕ ТРЕБОВАНИЕ: массив ОБЯЗАН быть предварительно ОТСОРТИРОВАН!
Принцип «Угадай число»:
• Смотрим на центральный элемент массива mid;
• Если target == a[mid] — элемент найден!;
• Если target < a[mid] — искомое число может быть только в левой половине (правая половина отбрасывается);
• Если target > a[mid] — искомое число только в правой половине (левая половина отбрасывается);
На каждом шаге область поиска СОКРАЩАЕТСЯ ВДВОЕ!
Схема бинарного деления пространства поиска
Линейный поиск
Бинарный поиск
Временная сложность бинарного поиска составляет :
• Для массива из 1 000 элементов бинарный поиск найдет ответ максимум за 10 сравнений ();
• Для массива из 1 000 000 элементов — всего за 20 сравнений ();
• Для массива из 1 000 000 000 элементов (миллиард!) — всего за 30 сравнений!
Линейный поиск для миллиарда элементов делал бы 1 миллиард операций.
