«1. Введение

В этом руководстве мы изучим сортировку выбором, увидим ее реализацию в Java и проанализируем ее производительность.

2. Обзор алгоритма

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

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

Этот процесс продолжается до тех пор, пока мы не достигнем n-1-го элемента массива, который помещает n-1-й наименьший элемент в n-1-ю позицию. Последний элемент автоматически встает на место, на n-1-й итерации, тем самым сортируя массив.

Мы находим самый большой элемент вместо самого маленького элемента, чтобы отсортировать массив в порядке убывания.

Давайте посмотрим на пример несортированного массива и отсортируем его в порядке возрастания, чтобы наглядно понять алгоритм.

2.1. Пример

Рассмотрим следующий несортированный массив:

int[] arr = {5, 4, 1, 6, 2}

Итерация 1

Принимая во внимание приведенную выше работу алгоритма, мы начинаем с элемент в 1-й позиции — 5 — и просматриваем все последующие элементы, чтобы найти наименьший элемент — 1. Затем мы меняем наименьший элемент с элементом в 1-й позиции.

Измененный массив теперь выглядит так:

{1, 4, 5, 6, 2}

Всего выполнено сравнений: 4

Итерация 2

Во второй итерации мы переходим к 2-й элемент — 4 — и сканируем последующие элементы, чтобы найти второй наименьший элемент — 2. Затем мы меняем местами второй наименьший элемент с элементом на 2-й позиции.

Измененный массив теперь выглядит так:

{1, 2, 5, 6, 4}

Всего выполнено сравнений: 3

Продолжая аналогичным образом, мы имеем следующие итерации:

Итерация 3 ~ ~~ {1, 2, 4, 6, 5}

Всего выполнено сравнений: 2

Итерация 4

{1, 2, 4, 5, 6}

Всего выполнено сравнений: 1 ~~ ~ 3. Реализация

Давайте реализуем сортировку выбором, используя пару циклов for:

Конечно, чтобы обратить ее вспять, мы могли бы сделать что-то очень похожее:

И немного больше усилий. , мы могли бы объединить их с помощью компараторов.

public static void sortAscending(final int[] arr) {
    for (int i = 0; i < arr.length - 1; i++) {
        int minElementIndex = i;
        for (int j = i + 1; j < arr.length; j++) {
            if (arr[minElementIndex] > arr[j]) {
                minElementIndex = j;
            }
        }

        if (minElementIndex != i) {
            int temp = arr[i];
            arr[i] = arr[minElementIndex];
            arr[minElementIndex] = temp;
        }
    }
}

4. Обзор производительности

public static void sortDescending(final int[] arr) {
    for (int i = 0; i < arr.length - 1; i++) {
        int maxElementIndex = i;
        for (int j = i + 1; j < arr.length; j++) {
            if (arr[maxElementIndex] < arr[j]) {
                maxElementIndex = j;
            }
        }

        if (maxElementIndex != i) {
            int temp = arr[i];
            arr[i] = arr[maxElementIndex];
            arr[maxElementIndex] = temp;
        }
    }
}

4.1. Время

В примере, который мы видели ранее, выбор наименьшего элемента требовал в общей сложности (n-1) сравнений с последующей перестановкой его на 1-ю позицию. Точно так же для выбора следующего наименьшего элемента требовалось общее (n-2) сравнений с последующей заменой на 2-й позиции и так далее.

Таким образом, начиная с индекса 0, мы выполняем n-1, n-2, n-3, n-4 …. 1 сравнения. Последний элемент автоматически встает на место благодаря предыдущим итерациям и перестановкам.

Математически сумма первых n-1 натуральных чисел скажет нам, сколько сравнений нам нужно, чтобы отсортировать массив размера n с помощью сортировки выбором.

Формула суммы n натуральных чисел: n(n+1)/2.

В нашем случае нам нужна сумма первых n-1 натуральных чисел. Поэтому мы заменим n на n-1 в приведенной выше формуле, чтобы получить:

(n-1)(n-1+1)/2 = (n-1)n/2 = (n^2-n) /2

Поскольку n^2 заметно растет с ростом n, мы рассматриваем более высокую степень n в качестве критерия производительности, делая этот алгоритм временной сложностью O(n^2).

4.2. Пробел

С точки зрения сложности вспомогательного пространства, сортировке выбором требуется одна дополнительная переменная для временного хранения значения для замены. Таким образом, пространственная сложность сортировки выбором равна O(1).

5. Заключение

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

«Другие методы сортировки, такие как сортировка вставками и сортировка Шелла, также имеют квадратичную временную сложность в худшем случае, но они работают лучше в лучшем и среднем случаях.

Ознакомьтесь с полным кодом сортировки выбором на GitHub.

«

Check out the complete code for Selection Sort over on GitHub.