Пузырёк, выбор и вставки — как упорядочить список своими руками.
⏱️ ~30 мин·Средний·📚 2 урока
Зачем писать сортировки руками
В Python есть встроенная sorted() и методФункция, привязанная к объекту и вызываемая через точку: text.upper()..sort() — на практике используют их, они быстрые и отлажены. Но классические сортировки учат думать алгоритмически: работать с индексами, обменивать элементы, оценивать число операций. Их часто просят написать на собеседованиях.
Сортировка пузырьком
Пузырёк (bubble sort) много раз проходит по списку и меняет местами соседние элементы, если они стоят в неправильном порядке. За каждый проход самый большой элемент «всплывает» в конец — как пузырёк воздуха в воде.
▶ bubble.py
Обмен двух элементов в Python делается одной строкой: arr[j], arr[j+1] = arr[j+1], arr[j]. Диапазон внутреннего циклаКонструкция, повторяющая блок кода: for перебирает элементы, while — пока условие истинно. уменьшается на i, потому что после i-го прохода последние i элементов уже на местах.
Сортировка выбором
Выбором (selection sort): на каждом шаге находим минимальный элемент в неотсортированной части и ставим его в начало. СписокИзменяемая упорядоченная коллекция элементов: [1, 2, 3]. По-английски list. как бы «отгрызается» слева — слева растёт отсортированная часть.
▶ selection.py
Сортировка вставками
Вставками (insertion sort) работает как раскладывание игральных карт в руке: берём очередной элемент и «вставляем» его на правильное место среди уже отсортированных слева, сдвигая большие элементы вправо. Она особенно хороша на почти отсортированных данных.
▶ insertion.py
📝Заметка
Все три сортировки имеют сложностьОценка роста числа операций/памяти при увеличении размера входа. Записывается как O(n). O(n²): на больших данных они заметно медленнее встроенной sorted() (та использует быстрый алгоритмЧёткая последовательность шагов для решения задачи за конечное число действий. Timsort, O(n log n)). Поэтому в реальном коде берите sorted(), а ручные сортировки изучайте ради понимания, как они устроены изнутри.
💡Совет
Предскажите вывод. Что напечатает обмен ниже? В Python правая часть вычисляется целиком до присваивания, поэтому переменныеИменованное хранилище для значения. Имя связывается со значением через присваивание: x = 5. меняются местами без временной переменной.
▶ predict-swap.py
Напечатается 2 1 и [2, 1, 3]. Множественное присваивание обменивает значения за один шаг — это сердце всех сортировок. Без него пришлось бы заводить временную переменную.
⚠️ Частые ошибки новичков
Ошибка. Менять элементы через tmp неправильно — сначала затереть один элемент, потеряв его значение. Множественное присваивание решает проблему, но если писать обмен в две строкиТекстовое значение в кавычках: "привет". Неизменяема. По-английски string (str). без tmp, данные портятся. Запустите код и убедитесь, что оба элемента стали одинаковыми.
▶ broken-swap.py
Заданиерешение.py
Напишите функцию bubble_sort(items), возвращающую новый отсортированный по возрастанию список (не меняя исходный). Реализуйте именно пузырьковую сортировку.
Заданиерешение.py
Напишите функцию selection_sort(items), реализующую сортировку выбором и возвращающую новый отсортированный список.
❓Проверь себя
Как «всплывает» элемент в сортировке пузырьком за один проход?
Какова сложность сортировок пузырьком, выбором и вставками в худшем случае?
Как в Python поменять местами две переменные a и b?
ℹ️Важно
✅ Что вы узнали
Пузырёк меняет соседей, проталкивая большие элементы в конец.
Выбор ищет минимум и ставит его в начало неотсортированной части.
Вставки раскладывают элементы как карты в руке.
Все три — O(n²); в реальном коде берите sorted() (O(n log n)).
Комментарии
Загрузка…
Загрузка комментариев…