Сортировка вставками

Сортировка вставками (Insertion Sort): идея «карточной игры», пошаговый разбор, код на Python, сложность O(n²) и O(n) на почти отсортированных данных.

Сортировка вставками строит отсортированный массив по одному элементу: берёт очередной элемент и «вставляет» его на правильное место среди уже упорядоченных. Так раскладывают карты в руке.

Сложность: O(n²) в среднем и худшем случае; O(n) в лучшем (уже отсортированный массив).

Идея алгоритма

Слева растёт отсортированная часть. Для каждого нового элемента мы «сдвигаем» уже стоящие элементы вправо до тех пор, пока не найдём правильное место для вставки. Метафора: как вставить новую карту в уже упорядоченный веер в руке.

Пошаговый разбор

Массив [7, 2, 4, 1, 5]:

Вставляем

Ключ

Массив после вставки

i=1

2

[2, 7, 4, 1, 5]

i=2

4

[2, 4, 7, 1, 5]

i=3

1

[1, 2, 4, 7, 5]

i=4

5

[1, 2, 4, 5, 7]

Код

def insertion_sort(arr):
    for i in range(1, len(arr)):
        key = arr[i]          # элемент для вставки
        j = i - 1
        while j >= 0 and arr[j] > key:
            arr[j + 1] = arr[j]   # сдвигаем вправо
            j -= 1
        arr[j + 1] = key          # вставляем на нужное место
    return arr

data = [7, 2, 4, 1, 5]
print(insertion_sort(data))

Вывод:

[1, 2, 4, 5, 7]

Сложность и свойства

Случай

Сравнений

Присвоений

Лучший (отсортирован)

O(n)

O(1)

Средний

O(n²)

O(n²)

Худший (обратный порядок)

O(n²)

O(n²)

Память: O(1) — in-place. Алгоритм устойчивый: равные элементы не меняют взаимного порядка.

На почти отсортированных данных (например, лог-файлах, куда новые записи добавляются в конец) insertion sort работает практически за O(n) и обгоняет «умные» алгоритмы за счёт крайне низких констант.

Когда применять

Insertion sort — отличный выбор для:

  • маленьких массивов (до ~30 элементов);
  • почти отсортированных данных;
  • онлайн-сортировки, когда элементы поступают по одному.

Именно поэтому гибридные алгоритмы (Timsort в Python, Introsort в C++) переключаются на insertion sort для маленьких подмассивов.

Коротко

  • Insertion sort берёт очередной элемент и вставляет его в правильное место в уже отсортированной части.
  • O(n²) в среднем и худшем, O(n) в лучшем случае.
  • In-place, устойчивый.
  • Эффективен на маленьких и почти отсортированных массивах; используется как финальный шаг в Timsort.
Проверьте себя
1. Какова сложность insertion sort на уже отсортированном массиве?
AO(n²)
BO(n log n)
CO(n)
DO(1)
2. Почему insertion sort используется в Timsort (Python)?
AПотому что он самый быстрый в общем случае
BПотому что он устойчив и эффективен на маленьких и почти отсортированных подмассивах
CПотому что он работает in-place
DПотому что он не рекурсивный
3. Что хранит переменная key в реализации insertion sort?
AМинимальный элемент массива
BТекущий элемент, который нужно вставить на нужную позицию
CИндекс отсортированной части
DПоследний добавленный элемент
4. Является ли сортировка вставками устойчивой?
AНет
BДа
CТолько для строк
DЗависит от реализации
Поддержать проект