Menu
Coddy logo textTech

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

Последнее обновление

Сортировка вставками строит отсортированный массив по одному элементу за раз. Она берёт следующий неотсортированный элемент («ключ») и сдвигает каждый больший элемент в отсортированной области на одну позицию вправо, затем помещает ключ в освободившийся промежуток. Именно так большинство людей сортируют карты в руке. Нажмите «воспроизвести» выше, чтобы увидеть, как вставляется каждый ключ, или пройдите сдвиги по одному.

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

Временная и пространственная сложность

СлучайСложностьПримечания
Лучший случайO(n)Уже отсортировано
Средний случайO(n²)Случайный порядок
Худший случайO(n²)Обратный порядок
ПамятьO(1)На месте
УстойчиваяДаРавные элементы сохраняют относительный порядок

Пошагово

ШагЧто происходит
1Считайте первый элемент отсортированной областью размера один.
2Возьмите следующий элемент в качестве ключа.
3Сдвиньте каждый отсортированный элемент, больший ключа, на одну позицию вправо.
4Вставьте ключ в открывшийся промежуток.
5Повторяйте, пока не будут вставлены все элементы.

Разобранный пример

Сортировка [5, 2, 4, 1]:

ПроходМассивДействие
Старт[5, 2, 4, 1]5 — начальная отсортированная область размера один.
1[2, 5, 4, 1]Ключ 2: сдвинуть 5 вправо, вставить 2 в начало.
2[2, 4, 5, 1]Ключ 4: сдвинуть 5 вправо, 2 меньше, поэтому стоп, вставить 4.
3[1, 2, 4, 5]Ключ 1: сдвинуть 5, 4, 2 вправо, вставить 1 в начало.
Готово[1, 2, 4, 5]Все элементы вставлены; массив отсортирован.

Когда использовать сортировку вставками

Используйте, когдаИзбегайте, когда
Массив небольшой (примерно n < 20).Массив большой и упорядочен случайно.
Данные уже почти отсортированы, что даёт лучший случай O(n).Нужен гарантированный худший случай O(n log n).
Нужна устойчивая сортировка на месте с дополнительной памятью O(1).Перемещение элементов дорого, так как выполняется много сдвигов.
Данные поступают постепенно и должны оставаться отсортированными в реальном времени.Вход отсортирован в обратном порядке, её худший случай O(n²).

Код Insertion Sort

Чистая, готовая к запуску реализация Insertion Sort на Python, JavaScript, Java, C++, C. Выберите язык, скопируйте код или откройте его уже загруженным в плейграунде Coddy.

Код Insertion Sort на Python

Python
1def insertion_sort(a):2    for i in range(1, len(a)):3        key = a[i]4        j = i - 15        # Shift larger elements one slot to the right6        while j >= 0 and a[j] > key:7            a[j + 1] = a[j]8            j -= 19        a[j + 1] = key10    return a11
12
13nums = [7, 3, 9, 1, 5, 8, 2]14print("Before:", nums)15insertion_sort(nums)16print("After: ", nums)
Запустите этот код в плейграунде Python

Часто задаваемые вопросы о сортировке вставками

Какова временная сложность сортировки вставками?
Сортировка вставками имеет сложность O(n²) в среднем и в худшем случае, но O(n) на уже отсортированном или почти отсортированном массиве. Она использует O(1) дополнительной памяти.
Является ли сортировка вставками устойчивой?
Да. Сортировка вставками сдвигает только элементы, строго большие ключа, поэтому равные элементы никогда не меняются местами и их относительный порядок сохраняется.
Когда следует использовать сортировку вставками?
Используйте её для небольших массивов или данных, которые уже почти отсортированы. Из-за низких накладных расходов и адаптивного лучшего случая гибридные алгоритмы, такие как Timsort, применяют её для коротких участков.
В чём разница между сортировкой вставками и сортировкой пузырьком?
Обе являются сортировками сравнением со сложностью O(n²), но сортировка вставками сдвигает элементы, чтобы открыть промежуток для ключа, тогда как сортировка пузырьком многократно меняет местами соседние неупорядоченные пары. Сортировка вставками обычно выполняет меньше записей и работает лучше на практике, особенно на почти отсортированных данных, где она достигает лучшего случая O(n).
Почему сортировка вставками быстрее сортировки слиянием на небольших массивах?
У сортировки вставками очень низкие постоянные накладные расходы и нет рекурсии или дополнительного выделения памяти, поэтому на малых входных данных она обгоняет сортировки O(n log n) несмотря на худшую асимптотическую сложность. Именно поэтому гибридные сортировки, такие как Timsort и introsort, переключаются на сортировку вставками для небольших подмассивов.
Сортировка вставками работает лучше со связным списком или с массивом?
Сортировка вставками обычно пишется для массивов, где основной расход — сдвиг элементов. В связном списке вы избегаете сдвига, вставляя узел на место, но теряете быстрый произвольный доступ, поэтому поиск точки вставки по-прежнему занимает линейное время на элемент, а общая стоимость остаётся O(n²).
Coddy programming languages illustration

Освойте алгоритмы с Coddy

НАЧАТЬ