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

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

В цикле находим минимальное значение, затем меняем местами с первым элементом, далее мы опять ищем минимальное значение, но меняем уже со вторым элементом и тд..

const arr = [9,2,3,5,9,1,10,58,-10]; // массив который нужно отсортировать.

console.log(arr.length);
let count = 0; // наше кол операций

function selectionSort(arr) {
    for(let i = 0; i < arr.length; i++) { // внешний цикл
        let indexMin = i;
            for(let j = i+1; j < arr.length; j++) { // внутрений цикл, который  каждую итерацию внешнего цикла будет проходить все элементы в массиве
                if(arr[j] < arr[indexMin]) {
                    indexMin = j;
                }
                count += 1; // кол операций
            }

            let tmp = arr[i]; // после внут цикла кладем в доп перменую первый элемент
            arr[i] = arr[indexMin]; // на место первого  кладем последний минимальный который нашли в итерациях внут цикла
            arr[indexMin] = tmp; // на место последнего кладем первый
            // Таким обращом к концу у нас в начале будут идти все минимальные по возвышению.

    }

    return arr;
}
console.log(selectionSort(arr));
console.log(count); // 36 итераций на массив из 9 элементов.

Рассматриваю все дотошно.

Запускаем основной цикл, который не закончится пока i меньше кол элементов в массиве.

for(let i = 0; i < arr.length; i++);

В первой итерации indexMin будет равно 0

let indexMin = i;

Первая итерация внут цикла

Далее идет внутрений цикл. Все так же как с первым, но тут уже j = i+1.

for(let j = i+1; j < arr.length; j++);

Далее идет условие. если arr arr[j] меньше чем arr[indexMin] В случае первой итерации это 2 и 9.

if(arr[j] < arr[indexMin]) {
    indexMin = j; // 2 меньше чем 9. Поэтому в IndexMin кладем j. В j у нас сейчас 1.
}

Вторая итерация внут цикла

Далее в j прибавляется еще 1 и получается j = 2, а indexMin = 1, так как в прошлой итерации мы присвоили в indexMin = j.
Теперь все в том же условии проверяем 2 и 3. Три не меньше двух, условие не срабатывает и мы идем к след итерации внут цикла.

if(arr[j] < arr[indexMin])

Третья итерация внут цикла

В indexMin у нас все еще 1, а j + 1 = 3

if(arr[j] < arr[indexMin]) // Опять условие

Проверяем 5 меньше чем 2? нет, идет след итерация.

Четвертая итерация внут цикла

indexMin(1) а j(4).

if(arr[j] < arr[indexMin])

Проверяем 9 меньше чем 2? нет. след итерация.

Пятая итерация внут цикла

indexMin(1), j(5) 1 меньше чем 2? Да. Срабатывает условие:

if(arr[j] < arr[indexMin]) {
    indexMin = j;
}

Теперь в indexMin = j(5) и идем дальше

Шестая итерация внут цикла

indexMin(5), в j(6) и проверяем 10 меньше чем 1? нет. Далее я не буду показывать условие, думаю и так уже понятно, что мы делаем.

Седьмая итерация внут цикла

indexMin(5), в j(7). 58 меньше чем 2? нет.

Восьмая итеарция внут цикла

В j уже последний элемент.
В indexMin(5) в массиве это 1 а в j(8) это -10
-10 меньше чем 1? ДА!
Помещаем в indexMin = j(8). Теперь в indexMin = 8

 indexMin = j;

Далее идет опять цикл и в j = i+1 и j становится равна 9.
9 Не меньше чем arr.length и происходит конец внутренего цикла. Выходим из внутреннего цикла и возвращаемся в конец первой итерации основного цикла.

Конец первой итерации внешнего цикла.

Мы создаем переменные.
В tmp кладем arr[i], i = 0 то есть кладем первый элемент.

let tmp = arr[i]; // кладем первый элемент в tmp. В массиве это 9.

Далее на место первого элемента кладем последний.

arr[i] = arr[indexMin]; // indexMin у нас 8, под индексом 8 в массиве это -10.
        // Мы заменяем первый элемент arr[i] = 9 на последний минимальный arr[indexMin] = -10.

И далее в indexMin кладем первый элемент.

arr[indexMin] = tmp;

Таким образом, после первой итерации на месте первого элемента у нас находится-10, а 9 в конце.
Во внутреннем цикле теперь итераций будет на 1 меньше,так как i теперь 1, а j = i + 1 то есть 2.
Первый элемент -10 у нас минимальный и он больше никем не трогается. Потом начинается след итерация основного цикла и внутренний будет делать уже 7 итераций, а не 8. Так как в первый раз у нас 8 итераций, во второй будет 7 и так далее.
8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 что дает нам как раз наши 36 операций.