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

если еще учесть, что на собеседования частенько спрашивают написать алгоритм определенного вида сортировки, то это будет достаточно полезно. многие кандидаты разве что и знают .sort =) или знают сортировку выбором, но не знают что она так называется. ну это из числа тех, что без образования - по самомучителям учатся.

Образование - не суть. Мы в универе изучали основные алгоритмы, но когда этим не пользуешься - оно забывается напрочь. Как и комбинаторика, высшая алгебра и т.д, и т.п. Сейчас смотришь - ну да, знакомо, но по факту практически заново нужно учить.

1 Симпатия

Прочитала все комменты, почитала про пузырьковую и сортировку выбором (спасибо @zateya и @Hierumo ) - вот у меня в результате возник вопрос к разработчикам курса:

Если в задании четко написано “Напиши сортировку массива выбором.”, почему тогда при написании программы Пузырьковой сортировкой, она проходит проверку?!

Сравнивается результат выполнения, а не реализация, которая к этому результату привела.

2 Симпатий

Да, всё верно.

Ага, понятно. Тогда еще вопрос: а как новичку понять, что он вообще сделал сортировку выбором? Ну почитал в википедии, но не факт, что понял и сделал правильно. Мог сделать пузырьковую, получить результат проверки правильный и на этом успокоиться)))), и, о ужас, решить, что теперь он владеет сортировкой выбором)))). Я к тому, что человеку, который вообще программирование/алгоритмы в первый раз в глаза видит, это крайне сложно))).

В точку!

эм - никак. на практике никто не сортирует в JS кроме как быстрым методом. JS имеет весьма ограниченный спектр применения (хоть и очень популярный), но например в шифровании (где эти самые разные алгоритмы сортировок используются) JS не применяется.
просто тут это используется, для понимания как происходит сортировка, вот и весь спрос.

1 Симпатия

Ага, т.е. сортируем вот так:

var numbers = [3, 5, 15, 6, 2, 1];
numbers.sort((a, b) => a - b)

а остальное для понимания/знания. Ок, спасибо!

Получилось что-то такое. Но я не уверена, что это нужное решение… :thinking:

for(var i = 0; i < numbers.length - 1; i++){  // Берем элементы массива по очереди для сравнения
  var minIndex; // Создаем переменную для хранения индекса минимального элемента
  var minElement = numbers[i]; // Допускаем, что это минимальный элемент
  for(var j = i + 1; j < numbers.length; j++){ // Ищем минимальный элемент из оставшихся
    if(numbers[j] < minElement){
    minElement = numbers[j];
    minIndex = j;
    }
  }
  if(minElement !== numbers[i]){ // Если минимальный элемент не равен изначальному значению, то меняем местами и идем к следующей итерации
    var swap = numbers[i];
    numbers[i] = minElement;
    numbers[minIndex] = swap;
    }
  console.log(numbers)
}

Поначалу получилось вот так:

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

Но, насколько я поняла, это не сортировка выбором, а пузырьковая сортировка. Ну или поправьте меня, если я не права. :slight_smile:

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

Спойлеры!
  var numbers = [3, 5, 15, 6, 2, 1];

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

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

Мой вариант сортировки выбором через 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;
  };
};

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

  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)