22 lines
2.5 KiB
Markdown
Executable File
22 lines
2.5 KiB
Markdown
Executable File
Это алгоритм, в котором элементы входной последовательности просматриваются по одному, и каждый новый поступивший элемент размещается в подходящее место среди ранее упорядоченных элементов. [Сложность алгоритма](Оценка%20сложности%20алгоритма): $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]]
|
||
#### В виде кода
|
||
```python
|
||
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
|
||
``` |