Мой вариант сортировки выбором через 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);
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;
}
}
}
Не вижу смысл проходить последнее значение, поскольку оно автоматически станет самым большим на предпоследней итерации.
Я решил так:
//проход по заменяемым значениям (от нуля до предпоследнего)
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);