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

zateya, Hierumo — спасибо вам огромное!

Теперь я понял, как работает этот код.

2 лайка

У вас тоже работает не так, как должно.
Screenshot_2
У вас двойка заняла первую позицию в массиве, когда сначала должна там появиться единица, как наименьший элемент.
Вот как следует переписать ваш код:


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

1 лайк

:slight_smile: смотрите, мы же обсуждали конкретный код, приведенный @ haosmos, который хотел понять как работает приведенный код.

Конечно, реальная сортировка выбором не меняет каждый раз (это уже даже выше указали), а меняет уже после нахождения минимума, когда прошлись по внутреннему циклу.
Действительно, нет нужды делать промежуточные перестановки до нахождения минимума.

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

1 лайк

Так-то я сам до конца разобрался с решением, только когда исправил код приведенный Кириллом. Так что я больше это себе объяснял :smile:

1 лайк

Вот да, Кирилл сделал отличную работу, т.е. подготовил все что нужно, чтобы сделать правильные выводы и найти оптимальное решение. :+1:

1 лайк

так то для сортировки есть метод для массивов .sort( (a,b) => a - b), он немного иначе работает и дает меньше итераций, если уж интересует самое оптимальное решение (ток его тут не преподают).
также можно было бы во внутреннем цикле сделать старт счетчика не j = i, а j = i + 1, так тоже меньше итераций будет (из того, что учили тут).

3 лайка

Счетчик я так и выставил в исправленном варианте j = i + 1 для внутреннего.
А методы sort использует алгоритм быстрой сортировки, что даже по условию задачи - не подходит. Ну и методы сейчас пока использовать - так себе идея. Нужно хотя бы элементарные алгоритмы разобрать и своими ручками их реализовать на практике.

вот выбирайте себе любой какой хотите =)

3 лайка

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

2 лайка

если еще учесть, что на собеседования частенько спрашивают написать алгоритм определенного вида сортировки, то это будет достаточно полезно. многие кандидаты разве что и знают .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:

1 лайк

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

Спойлеры!
  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;
      }
    }
  }