Menu
Coddy logo textTech

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

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

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

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

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

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

Пошагово

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

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

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

ПроходМассивДействие
Начало[5, 2, 4, 1]Весь массив неотсортирован.
1[1, 2, 4, 5]Просматриваем [5, 2, 4, 1], минимум - 1 на индексе 3; меняем местами с индексом 0.
2[1, 2, 4, 5]Просматриваем [2, 4, 5], минимум - 2 уже на индексе 1; меняется сам с собой.
3[1, 2, 4, 5]Просматриваем [4, 5], минимум - 4 уже на индексе 2; перемещение не нужно.
Готово[1, 2, 4, 5]Остался только 5, значит он уже на своём месте.

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

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

Код Selection Sort

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

Код Selection Sort на Python

Python
1def selection_sort(a):2    n = len(a)3    for i in range(n - 1):4        # Find the smallest element in the unsorted tail5        min_idx = i6        for j in range(i + 1, n):7            if a[j] < a[min_idx]:8                min_idx = j9        a[i], a[min_idx] = a[min_idx], a[i]10    return a11
12
13nums = [64, 25, 12, 22, 11]14print("Before:", nums)15selection_sort(nums)16print("After: ", nums)
Запустите этот код в плейграунде Python

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

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

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

НАЧАТЬ