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

Основные виды сортировок и примеры их реализации

Мой вариант сортировки выбором через Math.min : )

let [nl,q] = [numbers.length,[]];

for (var i = 0; i<= nl ; i++){
q = q.concat(numbers.splice(numbers.indexOf(Math.min(…numbers)),1));
}
numbers = q;

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

var numbers = [3, 5, 15, 6, 2, 1];
  for (var i = 0; i < numbers.length-1; i++){
    var min = swap = numbers[i];
    var minindex = i;
    for (var j = i + 1; j < numbers.length; j++){
      if(numbers[j]<min){
        min=numbers[j];
        minindex=j;
      }
     }
     numbers[i] = numbers[minindex];
     numbers[minindex]=swap;
   }

Читал, читал, и не понял, чем от отличается сортировка выбором от “пузырьковой”?
Мой код решения задачи:

var numbers = [3, 5, 15, 6, 2, 1];
var min = 0;
var indx = 0;

for ( var i = 0; i < numbers.length - 1; i++ ) {
  min  = numbers[i];
  for ( var j = i + 1; j < numbers.length; j++ ) {
    if ( numbers[j] < min ) {
      min = numbers[j];
      indx = j;
    };
  };
  if ( indx !== 0 ) {
    numbers[indx] = numbers[i];
    numbers[i] = min;
    indx = 0;
  };
};

И что за метод я применил? Выбора или “пузырьковый”?

1 лайк
  var numbers = [3, 5, 15, 6, 2, 1];

for (var i = 0; i <= numbers.length - 1; i++){
  for (var j = 0; j <= numbers.length - 2; j++){
    var startNumb = numbers[j];
  if (numbers[i] < startNumb){
    var swap = numbers[i];
    numbers[i] = numbers[j];
    numbers[j] = swap;
    console.log(numbers);
    console.log(startNumb);
  }
 }     
}
Может и не самый красивый код, но постарался максимально показать поэтапно логику работы (вывод в консоль всех итераций), может кому пригодится

// i - внешний цикл используем для замены переменных.
// j - внутренний цикл используем для перебора всех переменных и поиска минимальной.

var numbers = [3, 5, 15, 6, 2, 1];
var size = numbers.length;

// запускаем цикл по всем элементам от i-0 - i-Last -2 т.е до предпоследнего элемента. Т.к последний будет Max;
for (var i=0; i <= size -2; i++){
  //Объявляем первоначальную мин.переменную и записываем в неё значение элемента на каждом этапе цикла. т.е на i-0 = 3 i-1 = 5 и т.д.
  var min = numbers[i];
    //Проверка первичного вывода. ШАГ.МАССИВ.МИНИМУМ
    console.log('старт-шаг-i'+i,numbers)
    console.log('минимум до проверки '+min+' начинаем поиск минимума');
  //Внутренний цикл нахождения мимума начинается с позиции i+1; ищёт минимальный элемент в массиве, если нашёл перезаписывает min и записывает его позицию в массиве.  
  for (var j=1+i; j <= size -1; j++){
      console.log('шаг-j'+j,': старый минимум '+min,', проверяем число '+numbers[j]);
      if (numbers[j] < min){
      min = numbers[j]
      var index=j;
      console.log('Найден новый минимум','значение '+min,'индекс '+index);
      }
    }
    
  //Проверяем: если новый минимум найдет и он отличается от изначального то делаем перестановку.
  if (min < numbers[i]){
  console.log('новый минимум '+min +' меньше '+'старого минимума '+numbers[i]+' меняем их местами');
  swap = numbers[i];
  numbers[i] = min;
  numbers[index] = swap;}
 console.log('конец-шага-i'+i,numbers);   
}

Внесу свои 5 копеек:

Код
var numbers = [3, 5, 15, 6, 2, 1];
for (var i = 0; i < numbers.length - 1; i++) {
		var min = i;
		for (var j = i + 1; j < numbers.length; j++) {
		    if (numbers[j] < numbers[min]) {
				min = j;
			}
		}
		    var exchange = numbers[i];
		    numbers[i] = numbers[min];
		    numbers[min] = exchange;
	}

Я вот так решил )

var numbers = [3, 5, 15, 6, 2, 1];

for(var i = 0; i < numbers.length; i++){
  for(var j = i + 1; j < numbers.length; j++){
    if(numbers[i] > numbers[j]){
      var swap = numbers[i];
      numbers[i] = numbers[j];
      numbers[j] = swap;
    }
  }  
}

console.log(numbers);
1 лайк

numbers.sort((a, b) => a - b)

Мое решение:
var numbers = [3, 5, 15, 6, 2, 1];
var swap;

for (var i = 0; i < numbers.length; i++) {
for (var j = i + 1; j < numbers.length; j++) {
if (numbers[j] < numbers[i]) {
swap = numbers[i];
numbers[i] = numbers[j];
numbers[j] = swap;}
}
}
console.log(numbers);

Код сортировки именно выбором (как указано в задании):
var numbers = [3, 5, 15, 6, 2, 1];
for (var i = 0; i < numbers.length - 1; i++) {
var min = i; //вводим переменную для поиска индекса(!) минимального элемента в массиве
for (var j = i+1; j < numbers.length; j++) {
if (numbers[j] < numbers[min]) {
min = j;
}
}
if (min != i) {
var temp = numbers[i];
numbers[i] = numbers[min];
numbers[min] = temp;
}
}
Если сложно разобраться, советую рассмотреть выполнение кода пошагово на конкретном примере:
Заходим во внешний цикл, первый проход:
min = 0;
Заходим во внутренний цикл:
j последовательно будет принимать значения 1, 2, 3, 4, (тут перменная min поменяет своё значение, станет равна 4, так как numbers[4]=2, что меньше numbers[0]=3), 5 (min станет равна 5);
Далее выходим из внутреннего цикла:
5 != 0, меняем местами 3 и 1, после первого прохода массив имеет вид:
1, 5, 15, 6, 2, 3;
Потом i становится равно 1 и так далее.

Сделал так (кое-что интересное и полезное в моём решении можно найти):

  var numbers = [3, 5, 15, 6, 2, 1];

        for (var i = 0; i < numbers.length; i++) {
          var min = [i, numbers[i]];
          for (var j = i + 1; j < numbers.length; j++)
          {
            if (min[1] > numbers[j]) {
                min = [j, numbers[j]];
              }
          }
          if (min[0] !== i) 
    {[numbers[min[0]], numbers[i]] = [numbers[i], numbers[min[0]]];}
}

Вот моё решение. Сортировка выбором.

for (var i = 0; i < numbers.length - 1; i++) {
var min = i
var swap = numbers[i];
for (var j = i + 1; j < numbers.length; j++) {
    if (numbers[min] > numbers[j]) {
        min = j;
    }
}
numbers[i] = numbers[min];
numbers[min] = swap;

}

Code
let tempArr = [];

while(numbers.length !== 0) {
  let current = numbers[0]; 
  
  numbers.forEach(item => {
    if (item < current) {
      current = item;
    }
  });
  
  tempArr.push(current);
  const j = numbers.indexOf(current);  

  numbers.splice(j, 1);
}

numbers = tempArr;
code
let numbers = [3, 5, 15, 6, 2, 1];
let swap
for (let i = 0; i < numbers.length; i++) {
  for (let h = i + 1; h < numbers.length; h++) {
    if (numbers[h] < numbers[i]) {
      swap = numbers[i]
      numbers[i] = numbers[h]
      numbers[h] = swap
    }
  }
}

let numbers = [3, 5, 15, 6, 2, 1];

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

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

if (numbers[i]>numbers[j]) {
  let number= numbers[i];
  numbers[i]=numbers[j];
  numbers[j]=number
            
  }    
}

}
console.log(numbers)

let numbers = [3, 5, 15, 6, 2, 1];

for (let i = 0; i < numbers.length - 1; i++) {
  let minIndex = i;
  
  for (let j = i + 1; j < numbers.length; j++) {
    if (numbers[j] < numbers[minIndex]) {
      minIndex = j;
    }
  }
  
  if (minIndex !== i) {
    [numbers[i], numbers[minIndex]] = [numbers[minIndex], numbers[i]];
  }
}

let numbers = [3, 5, 15, 6, 2, 1];
for (let currentIndex = 0; currentIndex < numbers.length - 1; currentIndex++) {
let minValue = numbers[currentIndex];
for (let i = currentIndex + 1; i < numbers.length; i++) {
if (numbers[i] < minValue) {
minValue = numbers[i];
let swap = numbers[currentIndex];
numbers[currentIndex] = minValue;
numbers[i] = swap;
}
}
}

console.log(numbers);

Когда проходил тренажер с массивами аналогичное итоговое задание высосало весь мой мозг и я убил на его понимание больше дня… Но в результате “не глядя по сторонам” решение текущего задания написал минут за 15:

let numbers = [3, 5, 15, 6, 2, 1];

for (let i=0; i<=numbers.length-2;i++) {
for (let j=i+1; j<=numbers.length-1; j++) {
if (numbers[i]>numbers[j]) {
let swap = numbers[i];
numbers[i]=numbers[j];
numbers[j] = swap;
}
}
}

1 лайк

Не вижу смысл проходить последнее значение, поскольку оно автоматически станет самым большим на предпоследней итерации.
Я решил так:

//проход по заменяемым значениям (от нуля до предпоследнего)
for(i = 0; i < numbers.length - 1; i++) {
  let minValue = numbers[i];
//проход по значениям после i (для поиска наименьшего c последующей заменой)
  for(j = i + 1; j < numbers.length; j++){
    if(numbers[j] < minValue) {
      minValue = numbers[j];
      let swap = numbers[i];
      numbers[i] = minValue;
      numbers[j] = swap;
    }
  }
  
}

console.log(numbers);