Files
knowledge_vault/Языки программирования/Сортировка вставками.md
2026-01-20 09:34:05 +05:00

2.5 KiB
Raw Blame History

Это алгоритм, в котором элементы входной последовательности просматриваются по одному, и каждый новый поступивший элемент размещается в подходящее место среди ранее упорядоченных элементов. Сложность алгоритма: O(n^2).

Алгоритм

На вход алгоритма подаётся последовательность $n$ чисел: a_1,a_2,...,a_n. Сортируемые числа также называют ключами. Входная последовательность на практике представляется в виде массива с $n$ элементами. На выходе алгоритм должен вернуть перестановку исходной последовательности a^`_1,a^`_2,...,a^`_n, чтобы выполнялось следующее соотношение a_1^`\leqslant a_2^`\leqslant ... \leqslant a_n^` .

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

Данный алгоритм можно ускорить при помощи использования бинарного поиска для нахождения места текущему элементу в отсортированной части. Проблема с долгим сдвигом массива вправо решается при помощи смены указателей.

Пример

!sort_Insertion.gif

В виде кода

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