Сортировка вставками очень похожа на алгоритм сортировки выбором (selection sort). Она интуитивно понятна и также поддерживает отсортированную левую часть массива, постепенно продвигаясь к концу массива.
Если говорить подробнее, в алгоритме сортировки вставками мы начинаем с самого левого элемента и двигаемся дальше направо. Как только встречаем элемент, который меньше тех, что находятся слева от него, мы сдвигаем все элементы по одному вправо, чтобы освободить место и поставить это значение на корректную позицию. Например, если у нас есть массив [0, 2, 4, 1, 10, 8] и мы сейчас рассматриваем элемент 1, то сначала сдвигаем вправо 4, затем 2, а затем вставляем 1 между 0 и 2, получая [0, 1, 2, 4, 10, 8]. После этого переходим к следующему элементу 10. Ничего не делаем, так как он больше всех элементов слева. Затем берем 8 и сдвигаем 10 вправо, чтобы поставить 8 между 4 и 10.
a = [...]
for i in range(1, len(a)): # начинаем со второго элемента
while i > 0 and a[i] < a[i - 1]: # пока текущий элемент меньше предыдущего
a[i - 1], a[i] = a[i], a[i - 1] # меняем местами текущий элемент с предыдущим
i -= 1 # следим за индексом текущего элемента
print(a)
Алгоритм сортировки вставками вставляет текущий элемент на правильное место в уже обработанной части массива. В худшем случае, если элементы массива упорядочены по убыванию, для каждого i придется сдвигать все предыдущие элементы, чтобы расположить текущий элемент на нужную позицию. Это приведет к суммарным операциям.
Давайте пошагово разберем, как работает этот алгоритм на нескольких примерах: