Курс 3.8 — Алгоритмы · Раздел 05 · Урок 5.2

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

Разберём выбор минимального элемента и его перестановку в начало оставшейся части массива.

Разберём выбор минимального элемента и его перестановку в начало оставшейся части массива.
5.2 — Сортировка выбором

Материал урока

Идея алгоритма проста:

  1. Находим минимальный элемент в массиве.
  2. Меняем его местами с первым элементом.
  3. Повторяем то же самое для оставшегося подмассива (без первого элемента).

В результате минимальные элементы постепенно «выстраиваются» в начале массива, и весь список оказывается отсортирован.

Рекурсивная версия

def min_value_idx(arr):
    """Возвращает индекс минимального элемента массива"""
    result = 0
    for i in range(1, len(arr)):
        if arr[i] < arr[result]:
            result = i
    return result

def choice_sort(arr):
    """Сортировка выбором (рекурсивная версия)"""
    if len(arr) > 1:
        idx = min_value_idx(arr)
        # Меняем местами первый элемент и минимальный
        arr[0], arr[idx] = arr[idx], arr[0]
        # Рекурсивный вызов для хвоста массива
        choice_sort(arr[1:])

# Проверка
A = [5, 3, 6, 2, 1, 4]
choice_sort(A)
print(A)  # [1, 2, 3, 4, 5, 6]

Важно: увидеть как работает рекурсия — мы выделили минимальный элемент, поставили его в начало и повторили процесс для оставшегося массива.

Итеративная версия

Чтобы сделать алгоритм более наглядным и практичным, перепишем его в виде цикла:

def choice_sort_iter(arr):
    """Сортировка выбором (итеративная версия)"""
    n = len(arr)
    for start in range(n - 1):
        # Находим индекс минимального элемента в подмассиве
        min_idx = start
        for i in range(start + 1, n):
            if arr[i] < arr[min_idx]:
                min_idx = i
        
        # Меняем элементы только если это действительно нужно
        if start != min_idx:
            arr[start], arr[min_idx] = arr[min_idx], arr[start]

# Проверка
B = [7, 2, 9, 1, 5, 3]
choice_sort_iter(B)
print(B)  # [1, 2, 3, 5, 7, 9]

Сложность

Хотя в рекурсивной версии нет циклов внутри функции, важно понимать:

  • на каждом шаге мы ищем минимальный элемент (это O(n)),
  • и таких шагов n.

В сумме получаем сложность O(n²).

Поэтому сортировка выбором относится к квадратичным сортировкам.