В цикле находим минимальное значение, затем меняем местами с первым элементом, далее мы опять ищем минимальное значение, но меняем уже со вторым элементом и тд..
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 операций.