- Объяснять, зачем нужна сортировка
- Пошагово выполнять сортировку пузырьком, выбором и вставками
- Сравнивать алгоритмы по числу выполняемых сравнений
Контакты в телефоне стоят по алфавиту, таблица рекордов в игре — по очкам, товары в интернет-магазине можно выстроить по цене. Во всех этих случаях компьютер выполняет сортировку — расставляет элементы по порядку согласно какому-то правилу. К тому же, как мы видели на прошлом уроке, быстрый двоичный поиск работает только с упорядоченным списком. Так как же компьютер сортирует список?
Перестановка элементов списка в порядке, заданном некоторым правилом, — например, по возрастанию, по убыванию или по алфавиту.
Сортировка пузырьком
При сортировке пузырьком соседние элементы сравниваются попарно: если левый больше правого, они меняются местами. Просмотр списка от начала до конца называется проходом. После каждого прохода самый большой из оставшихся элементов, как пузырёк в воде, «всплывает» в конец списка. Если за проход не было ни одной перестановки, список уже отсортирован.
Отсортируй список [5, 1, 4, 2] по возрастанию методом пузырька.
Показать решениеСкрыть решение
5 > 1 → меняем: [1, 5, 4, 2]
5 > 4 → меняем: [1, 4, 5, 2]
5 > 2 → меняем: [1, 4, 2, 5] — 5 на своём месте.
2-й проход:
1 < 4 → без изменений
4 > 2 → меняем: [1, 2, 4, 5] — 4 на своём месте.
3-й проход:
1 < 2 → без изменений. Перестановок не было — список отсортирован: [1, 2, 4, 5].
Всего выполнено 3 + 2 + 1 = 6 сравнений.
def bubble_sort(a):
a = a[:]
n = len(a)
for i in range(n - 1):
swapped = False
for j in range(n - 1 - i):
if a[j] > a[j + 1]:
a[j], a[j + 1] = a[j + 1], a[j]
swapped = True
if not swapped:
break
return a
print(bubble_sort([5, 1, 4, 2]))
print(sorted(['Murad', 'Aysel', 'Leyla', 'Elvin']))▸ Ожидаемый результат
[1, 2, 4, 5] ['Aysel', 'Elvin', 'Leyla', 'Murad']
swapped запоминает, были ли перестановки за проход; если нет, алгоритм останавливается досрочно. Встроенная функция Python sorted() умеет сортировать и строки по алфавиту.Сортировка выбором
При сортировке выбором в неотсортированной части списка находят наименьший элемент и меняют его местами с первым элементом этой части. Так отсортированная часть слева на каждом шаге растёт на один элемент.
Отсортируй список [29, 10, 14, 37, 13] по возрастанию методом выбора.
Показать решениеСкрыть решение
Шаг 2: в части [29, 14, 37, 13] наименьший — 13, меняем его с 29 → [10, 13, 14, 37, 29]
Шаг 3: в части [14, 37, 29] наименьший — 14, он уже на месте.
Шаг 4: в части [37, 29] наименьший — 29, меняем его с 37 → [10, 13, 14, 29, 37].
Сортировка вставками
Сортировка вставками похожа на то, как игрок раскладывает карты в руке: берёт следующую карту и вставляет её на нужное место среди уже упорядоченных. Этот способ работает очень быстро, если список почти отсортирован.
Отсортируй список [4, 3, 5, 1] вставками.
Показать решениеСкрыть решение
Берём 3: 3 < 4, ставим перед 4 → [3, 4, 5, 1]
Берём 5: 5 > 4, остаётся на месте → [3, 4, 5, 1]
Берём 1: 5, 4 и 3 сдвигаются на одно место вправо, 1 встаёт в начало → [1, 3, 4, 5].
Какой алгоритм быстрее?
Скорость сортировки обычно измеряют числом сравнений. Каждый из трёх простых способов в худшем случае выполняет около n(n − 1) / 2 сравнений: 45 при n = 10 и уже 499 500 при n = 1000. Если список станет в 10 раз длиннее, работа вырастет примерно в 100 раз!
- Kчисло сравнений в худшем случае
- nколичество элементов в списке
| Способ | Идея | Худший случай | Уже упорядоченный список |
|---|---|---|---|
| Пузырьком | сравнивать соседей и менять их местами | n(n − 1) / 2 | n − 1 (с досрочной остановкой) |
| Выбором | находить наименьший и ставить его в начало | n(n − 1) / 2 | n(n − 1) / 2 |
| Вставками | вставлять каждый элемент в отсортированную часть | n(n − 1) / 2 | n − 1 |
Главное
- Сортировка расставляет элементы по порядку; двоичному поиску нужен отсортированный список.
- Сортировка пузырьком сравнивает соседей; после каждого прохода наибольший элемент оказывается в конце.
- Сортировка выбором каждый раз находит наименьший элемент и ставит его в начало неотсортированной части.
- Сортировка вставками вставляет каждый элемент на своё место в отсортированной части.
- Простые способы в худшем случае выполняют n(n − 1) / 2 сравнений; для больших списков есть более быстрые алгоритмы.
Проверь себя
Вопросов: 10. Каждый правильный ответ приносит XP.