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

Слайд 3

🎯 Сортировка выбором (Selection Sort)

Алгоритм сортировки выбором — это улучшенная версия пузырьковой сортировки. Он делает только один обмен за каждый проход по списку. Вместо многократного обмена соседних элементов, он сначала находит максимальный (или минимальный) элемент и помещает его на нужное место.

📘 Идея алгоритма

Для списка длиной n нужно выполнить n - 1 проход. На каждом проходе ищется максимальный элемент неотсортированной части списка и ставится в конец этой части.

💡 После каждого прохода один элемент занимает своё окончательное место в отсортированном списке.

🔹 Пример: сортировка a = [5, 1, 8, 2, 4]

Первый проход:

Находим максимальный элемент 8 и меняем его с последним элементом:

[5, 1, 8, 2, 4] → [5, 1, 4, 2, 8]
Второй проход:

Находим максимальный элемент 5 в оставшейся части [5, 1, 4, 2] и меняем его с предпоследним элементом:

[5, 1, 4, 2, 8] → [2, 1, 4, 5, 8]
Третий проход:

Находим максимальный элемент 4 в неотсортированной части [2, 1, 4] — он уже на своём месте:

[2, 1, 4, 5, 8]
Четвёртый проход:

Находим максимальный элемент 2 и меняем его с 1:

[2, 1, 4, 5, 8] → [1, 2, 4, 5, 8]
✅ Список отсортирован. Вместо поиска максимального можно искать минимальный элемент — результат будет тот же.

💻 Реализация на Python

a = [1, 7, -3, 9, 0, -67, 34, 12, 45, 1000, 6, 8, -2, 99]
n = len(a)

for i in range(n - 1):
    max_index = 0
    for j in range(1, n - i):
        if a[j] > a[max_index]:     # ищем индекс максимального элемента
            max_index = j
    a[max_index], a[n - i - 1] = a[n - i - 1], a[max_index]  # ставим его в конец

print('Отсортированный список:', a)

Результат:

Отсортированный список: [-67, -3, -2, 0, 1, 6, 7, 8, 9, 12, 34, 45, 99, 1000]

⚙️ Поиск минимального вместо максимального

Можно сортировать по возрастанию, находя минимальный элемент и перемещая его в начало. Это даёт тот же результат, но визуально алгоритм движется "слева направо", а не "справа налево".

a = [5, 1, 8, 2, 4]
n = len(a)

for i in range(n - 1):
    min_index = i
    for j in range(i + 1, n):
        if a[j] < a[min_index]:       # ищем минимальный элемент
            min_index = j
    a[i], a[min_index] = a[min_index], a[i]  # меняем местами

print('Отсортированный список:', a)

Результат:

Отсортированный список: [1, 2, 4, 5, 8]
⚡ В отличие от пузырьковой сортировки, здесь совершается всего один обмен за проход, но при этом алгоритм всё ещё имеет временную сложность O(n²).