Python Glossary English

все Python 3Алгоритмы и структуры данныхпонятие

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

сортировка

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

Синтаксис

def insertion_sort(arr):

Алгоритм учебный, но не бесполезный: Timsort внутри list.sort() досортировывает вставками короткие участки, потому что на почти упорядоченных данных они действительно близки к O(n). Сортировка устойчива — равные элементы сохраняют взаимный порядок, что важно, когда сортируют по одному ключу после другого. Питон-специфичная ловушка: если в условии внутреннего цикла забыть проверку j >= 0, отрицательный индекс не даст IndexError, а начнёт читать элементы с конца списка, и ошибка проявится молча — неверным результатом.

Примеры

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
print(insertion_sort([12,11,13,5,6]))  # → [5,6,11,12,13]
# Трассировка
def ins_trace(arr):
    arr = 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
        print(arr)
    return arr
ins_trace([4,3,1,2])
# Онлайн-алгоритм (добавление элементов)
def ins_insert(sorted_arr, x):
    i = len(sorted_arr)
    sorted_arr.append(x)
    while i > 0 and sorted_arr[i-1] > x:
        sorted_arr[i] = sorted_arr[i-1]
        i -= 1
    sorted_arr[i] = x
    return sorted_arr
result = []
for x in [3,1,4,1,5]:
    ins_insert(result, x)
print(result)  # → [1,1,3,4,5]
# Binary insertion sort
import bisect
def bin_ins_sort(arr):
    result = []
    for x in arr:
        bisect.insort(result, x)
    return result
print(bin_ins_sort([5,3,1,4,2]))  # → [1,2,3,4,5]
# Скорость на почти отсортированных данных
import random
arr = list(range(100))
arr[50] = -1  # один элемент не на месте
print(insertion_sort(arr[:])[:5])  # → [-1, 0, 1, 2, 3]

См. также

Открыть в полном глоссарииdocs.python.orgСообщить о неточности