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

Базовый Algorithms
≈ 2 мин чтения

Вставляем элемент в уже готовую часть

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

static void insertionSort(int[] a) {
    for (int i = 1; i < a.length; i++) {
        int value = a[i];
        int j = i - 1;

        while (j >= 0 && a[j] > value) {
            a[j + 1] = a[j];
            j--;
        }

        a[j + 1] = value;
    }
}

Значение value временно сохраняется отдельно. Пока слева встречаются элементы больше него, они сдвигаются вправо. Когда цикл заканчивается, позиция j + 1 и есть место вставки. После каждой итерации диапазон от 0 до i полностью отсортирован.

Почему почти отсортированные данные удобны

Если элементы уже находятся близко к своим правильным позициям, внутренний цикл делает мало сдвигов. Для полностью отсортированного массива условие a[j] > value сразу ложно на каждом шаге, поэтому время становится O(n).

В среднем и в худшем случае сортировка вставками имеет сложность O(n²), а дополнительная память равна O(1). Для небольших или почти отсортированных массивов она может быть вполне практичной именно из-за малого служебного расхода.