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

Базовый Algorithms
≈ 2 мин чтения

Находим следующий минимум

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

static void selectionSort(int[] a) {
    for (int i = 0; i < a.length - 1; i++) {
        int minIndex = i;

        for (int j = i + 1; j < a.length; j++) {
            if (a[j] < a[minIndex]) {
                minIndex = j;
            }
        }

        int tmp = a[i];
        a[i] = a[minIndex];
        a[minIndex] = tmp;
    }
}

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

Чем она отличается от пузырьковой

Пузырьковая сортировка может делать много обменов за один проход, а сортировка выбором — не больше одного. Зато число сравнений почти не зависит от исходного порядка: даже если массив уже отсортирован, алгоритм всё равно просматривает оставшуюся часть в поисках минимума.

Сложность

Количество сравнений остаётся O(n²) в лучшем, среднем и худшем случаях. Дополнительная память — O(1). Сильная сторона алгоритма — небольшое число обменов, но по времени на больших массивах он всё равно проигрывает более эффективным сортировкам.