Перейти к содержанию
Educora
Средний9–11 классы18 мин28 / 59

Алгоритмы сортировки

Узнай, как работают сортировка пузырьком, выбором и вставками, и сравни их скорость.

Проверь себя
В этом уроке ты узнаешь
  • Объяснять, зачем нужна сортировка
  • Пошагово выполнять сортировку пузырьком, выбором и вставками
  • Сравнивать алгоритмы по числу выполняемых сравнений

Контакты в телефоне стоят по алфавиту, таблица рекордов в игре — по очкам, товары в интернет-магазине можно выстроить по цене. Во всех этих случаях компьютер выполняет сортировку — расставляет элементы по порядку согласно какому-то правилу. К тому же, как мы видели на прошлом уроке, быстрый двоичный поиск работает только с упорядоченным списком. Так как же компьютер сортирует список?

Определение
Сортировка

Перестановка элементов списка в порядке, заданном некоторым правилом, — например, по возрастанию, по убыванию или по алфавиту.

Сортировка пузырьком

При сортировке пузырьком соседние элементы сравниваются попарно: если левый больше правого, они меняются местами. Просмотр списка от начала до конца называется проходом. После каждого прохода самый большой из оставшихся элементов, как пузырёк в воде, «всплывает» в конец списка. Если за проход не было ни одной перестановки, список уже отсортирован.

Пример: сортировка пузырьком

Отсортируй список [5, 1, 4, 2] по возрастанию методом пузырька.

Показать решение
1-й проход:
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 сравнений.
Интерактив
Загрузка симуляции…
Посмотри, как сравниваются столбики и как самый высокий из них на каждом проходе «всплывает» в конец.
Python
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] по возрастанию методом выбора.

Показать решение
Шаг 1: наименьший элемент — 10, меняем его с 29 → [10, 29, 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] вставками.

Показать решение
Вначале в отсортированной части только 4.
Берём 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 − 1) / 2K = n(n − 1) / 2
где:
  • Kчисло сравнений в худшем случае
  • nколичество элементов в списке
СпособИдеяХудший случайУже упорядоченный список
Пузырькомсравнивать соседей и менять их местамиn(n − 1) / 2n − 1 (с досрочной остановкой)
Выборомнаходить наименьший и ставить его в началоn(n − 1) / 2n(n − 1) / 2
Вставкамивставлять каждый элемент в отсортированную частьn(n − 1) / 2n − 1
Число сравнений (n — количество элементов)

Главное

  • Сортировка расставляет элементы по порядку; двоичному поиску нужен отсортированный список.
  • Сортировка пузырьком сравнивает соседей; после каждого прохода наибольший элемент оказывается в конце.
  • Сортировка выбором каждый раз находит наименьший элемент и ставит его в начало неотсортированной части.
  • Сортировка вставками вставляет каждый элемент на своё место в отсортированной части.
  • Простые способы в худшем случае выполняют n(n − 1) / 2 сравнений; для больших списков есть более быстрые алгоритмы.

Проверь себя

Вопросов: 10. Каждый правильный ответ приносит XP.

1 / 10
Какие элементы сравниваются при сортировке пузырьком?