Python Glossary English

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

Сортировка выбором

сортировка

O(n²). Находит минимальный элемент и ставит на нужное место. Минимум обменов (O(n)).

Синтаксис

def selection_sort(arr):

В отличие от вставок и пузырька, здесь нет быстрого случая: полный проход по остатку делается всегда, поэтому даже на уже отсортированном списке те же O(n²) сравнений. Зато обменов ровно O(n) — по одному на позицию, и это единственная практическая причина о ней помнить: когда запись дороже чтения. Классическая реализация через обмен с минимумом неустойчива — равные элементы могут поменяться местами, так что для сортировки по нескольким ключам подряд она не подходит.

Примеры

def selection_sort(arr):
    n = len(arr)
    for i in range(n):
        min_idx = i
        for j in range(i+1, n):
            if arr[j] < arr[min_idx]:
                min_idx = j
        arr[i], arr[min_idx] = arr[min_idx], arr[i]
    return arr
print(selection_sort([64,25,12,22,11]))  # → [11,12,22,25,64]
# Трассировка
def sel_trace(arr):
    arr = arr[:]
    n = len(arr)
    for i in range(n):
        min_idx = i
        for j in range(i+1, n):
            if arr[j] < arr[min_idx]:
                min_idx = j
        arr[i], arr[min_idx] = arr[min_idx], arr[i]
        print(arr)
    return arr
sel_trace([3,1,4,2])
# Descending
def sel_desc(arr):
    n = len(arr)
    for i in range(n):
        max_idx = i
        for j in range(i+1, n):
            if arr[j] > arr[max_idx]:
                max_idx = j
        arr[i], arr[max_idx] = arr[max_idx], arr[i]
    return arr
print(sel_desc([3,1,4,1,5]))  # → [5,4,3,1,1]
# Подсчёт шагов
def sel_steps(arr):
    n = len(arr); comparisons = 0
    for i in range(n):
        min_idx = i
        for j in range(i+1, n):
            comparisons += 1
            if arr[j] < arr[min_idx]:
                min_idx = j
        arr[i], arr[min_idx] = arr[min_idx], arr[i]
    return comparisons
print(sel_steps([5,4,3,2,1]))  # → 10 сравнений для n=5
# Selection sort всегда O(n²) независимо от входных данных
print(selection_sort([1,2,3,4,5]))  # → [1,2,3,4,5] (уже отсортирован)

См. также

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