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

Сортировка вставками, также известная как "сортировка прямыми вставками", является одним из простых алгоритмов сортировки. Он основан на том, что элементы в список вставляются в уже отсортированную часть списка на свое место.

Алгоритм сортировки вставками просто проходит по списку элементов и для каждого элемента находит его положение в отсортированной части списка и вставляет его туда. Это продолжается до тех пор, пока все элементы не будут отсортированы.

Вот как выглядит алгоритм сортировки вставками в 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

# Пример использования
arr = [5, 2, 9, 1, 3]
insertion_sort(arr)
print(arr)

В этом примере мы создаем функцию insertion_sort, которая принимает список arr в качестве аргумента. С помощью цикла for проходим по всем элементам списка, начиная со второго элемента (индекс 1), поскольку первый элемент можно считать уже отсортированным.

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

После завершения работы алгоритма список будет отсортирован в порядке возрастания: [1, 2, 3, 5, 9].

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

Таким образом, сортировка вставками - это простой и эффективный алгоритм сортировки, особенно для маленьких списков или частично отсортированных списков.