Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

Javascript - ручная сортировка

#javascript #сортировка #функции #циклы


Есть недоделанная функция сортировки, которая должна находить минимальный элемент
массива и засовывать его в новый массив. Так как я не знаю, как удалить предыдущий
минимальный эллемент, функция выдает массив из одного самого минимального числа из
данного ей массива(например [44, 5, 2, 6, 3] она выдает [2, 2, 2, 2, 2], вместо [2,
3, 5, 6, 44])

Мне нужно дополнить/подправить код ниже, а не новый или сокращенный вариант. Я хочу
понять, как это работает через функции и циклы, сколько только я разных способов не
перепробовал - все напрасно:

function sort(arr) {
    var sorted = [];
    var min = Infinity;
    for (j = 0; j < arr.length; j++) {
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] < min ) {
                min = arr[i];
            }
        }
        sorted.push(min);
    }
    return sorted;
}

    


Ответы

Ответ 1



Код в вопросе мягко говоря не оптимален, но его можно "исправить" ) function sort(arr) { var sorted = []; var min = Infinity; var minIndex = Infinity; for (j = 0; j < arr.length; j++) { for (var i = 0; i < arr.length; i++) { if (arr[i] < min ) { min = arr[i]; minIndex = i;// нужен предполагаемый индекс минимума кроме самого минимума, чтобы убрать его из исходного массива } } arr[minIndex] = Infinity;// исходный массив надо поправить, в нем нет больше "найденного минимального элемента, поставим бесконечность, чтобы была больше любого" sorted.push(min); min = Infinity;// надо сбрасывать минимум, иначе в следующей итерации не найдем ничего меньше, либо инициализиировать переменную внутри первого for } return sorted; }

Ответ 2



var mins = []; //сюда будем записывать минимумы //массив массивов var arr = [ [10, 1, 5, 3, 6], [65, 21, 45, 32, 16], [300, 20, 25, 78, 6015], ]; var absMin = arr[0][0]; //мимимум по всем строкам for (var i = 0; i < arr.length; i++) { var row = arr[i]; //поиск минимума в строке var min = row[0]; for (var j = 0; j < row.length; j++) { var num = row[j]; if (num < min) min = num; if (num < absMin) absMin = num; } mins.push(min); } document.write('Минимальные элементы в каждой строке:
[' + mins.join(', ') + ']'); document.write('
'); document.write('Абсолютный мимимум:
' + absMin); Демонстрация работы тут https://codepen.io/lukas-pierce/pen/MJdmWm

Ответ 3



Сразу не понял постановку задачи: var nums = [44, 5, 2, 6, 3]; nums.sort(function(a, b){ return a - b; }); document.write('[' + nums.join(', ') + ']'); рабочий пример тут https://codepen.io/lukas-pierce/pen/jyomyB

Ответ 4



Так что ли? console.info([44, 5, 2, 6, 3].sort((a, b) => a > b)); Не надо создавать велосипед в данном случае. Будет тормозить (относительно нативной реализации) и поддерживать сложно. Но всё же: let arr = [44, 5, 2, 6, 3]; const sort = a => { let len = a.length - 1; // Проход каждому элементу for(let i = 0; i < len; i++) // Проводим элемент по массиву for(var e = 0; e < len - i; e++) // Если элемент больше следующего if(a[e] > a[e + 1]) // То флипаем его (меняем местами) [a[e], a[e + 1]] = [a[e + 1], a[e]]; return a; }; console.info(sort(arr));

Ответ 5






Результат

Ссылка на рабочий пример https://codepen.io/lukas-pierce/pen/EZzEEx

Комментариев нет:

Отправить комментарий