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

Сортировка выбором – один из базовых алгоритмов сортировки, который используется для упорядочивания элементов массива. В статье вы найдете подробное объяснение принципа работы этого алгоритма, а также примеры его реализации на языке JavaScript.

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

Вадим Дворниковавтор материала

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

При использовании этого алгоритма массив делится на две части –отсортированную и несортированную. Сортированный список находится вначале. Все элементы справа от последнего отсортированного элемента считаются несортированными.

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

После этого программа снова находит подходящий элемент, меняя его на крайний левый элемент несортированного списка и расширяя отсортированный список.

После каждой итерации необходимо проверять на один элемент меньше, пока не будет отсортирован весь массив или список.

Рассмотри, как сортировка выборкой работает с массивом:

 5, 2, 4, 6, 1,
Сортировка выбором

Реализация сортировки выборкой

Перейдем к реализации данного алгоритма в JavaScript:

function selectionSort(inputArr) { 
    let n = inputArr.length;
        
    for(let i = 0; i < n; i++) {
        // Находим наименьшее число в правой части массива
        let min = i;
        for(let j = i; j < n; j++) {
            if(inputArr[j] < inputArr[min]) {
                min=j; 
            }
         }
         if (min != i) {
             // Заменяем элементы
             let tmp = inputArr[i]; 
             inputArr[i] = inputArr[min];
             inputArr[min] = tmp;      
        }
    }
    return inputArr;
}

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

Теперь добавим входной массив и вызовем функцию:

let inputArr = [5, 2, 4, 6, 1, 3];
selectionSort(inputArr);
console.log(inputArr);

Результат работы кода:

(6) [1, 2, 3, 4, 5, 6]

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

На первой итерации, в массиве, состоящем из n элементов, мы делаем n-1 сравнений и одну замену. Во второй итерации мы выполняем n-2 сравнения и т.д. Следовательно, общее количество сравнений будет (n-2) + (n-1) + ... + 1 , что в сумме составит n (n-1) / 2 = (n 2 -n) / 2 . Это дает нам время работы O(n 2 ).

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

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

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

Варианты сортировки выбором

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

Другой вариант – двунаправленная сортировка выбором. Она выполняет ту же самую работу на 25% быстрее.

Заключение

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

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

Вадим Дворниковавтор-переводчик статьи «Selection Sort in JavaScript»

Комментарии

Оставьте свой комментарий
Александр Е.

Дополнение))))

for(let j = i; j < n; j++) { // Находим наименьшее число в проходе
console.log(j, ' - Индекс в цикле = ' ,inputArr[j], '. ' , min, '- Минимальное значение индекса = ' , inputArr[min]);
if(inputArr[j] < inputArr[min]) {
console.log('Найдено минимальное число не в массиве', inputArr[j], 'а ', inputArr[min]);
min=j;
}
}

if (min != i) { // Заменяем элементы
let tmp = inputArr[i]; //создаем переменную, которая в свою очередь принимает индекс массива в проходе (как будто буфер)
inputArr[i] = inputArr[min]; //индекс массива заменяется на индекс минимального значения
inputArr[min] = tmp; //индекс, который был минимальным принимает значение из "буфера" чтоб не потерять массив

Евгений М.

Привет!

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

for (let j = i; j &lt; n; j++)

Алексей Д.

Привет!

Спасибо за корректировку, код в статье поправили!

Евгений М.

Самый лучший! Еще раз тебе спасибо 🙂