#javascript #сортировка
Изучаю JavaScript, метод sort()
Все в общем-то понятно было, но далее я встретил пример из учебника с методом Math.random() :
Задание:
Используйте функцию sort для того, чтобы «перетрясти» элементы массива в случайном
порядке.
Решение(дано в учебнике, но без объяснений):
Функция сортировки должна возвращать случайный результат сравнения. Используйте
для этого Math.random.
Обычно Math.random() возвращает результат от 0 до 1. Вычтем 0.5, чтобы область
значений стала [-0.5 ... 0.5).
var arr = [1, 2, 3, 4, 5];
function compareRandom(a, b) {
return Math.random() - 0.5;
}
arr.sort(compareRandom);
alert( arr ); // элементы в случайном порядке, например [3,5,1,2,4]
Долго думал. Я так понимаю действие данной return Math.random() - 0.5; строчки:
"универсальный алгоритм сортировки" берет два числа(a и b), далее запускается return
Math.random() - 0.5; если число меньше ноля, первым в записи идет a(сортировка поставит
a по меньшему индексу), если больше ноля, первым идет в записи b( сортировка поставит
b по меньшему индексу). Чтобы было нагляднее, я нарисовал схему(на примере(2, 4)):
1). Мой первый вопрос, правильно ли я понимаю работу данной функции. Также хочется
узнать доступным языком принцип действия "универсальный алгоритм сортировки".
// ######
На данном этапе изучения JavaScript я понял, что в функции, в скобках передаются
значения, и конечно они используются в самой функции, вот пример:
function compareNumeric(a, b) {
return a - b;
}
var arr = [ 1, 2, 15 ];
arr.sort(compareNumeric);
alert(arr); // 1, 2, 15
Но в первом примере, в функции, a и b не используются, а сразу идет return, поэтому
я попробовал совсем их убрать и записал так:
var arr = [1, 2, 3, 4, 5];
function compareRandom() {
return Math.random() - 0.5;
}
arr.sort(compareRandom);
alert( arr );
Удивительно, но все работает и так.
2). Мой второй вопрос, в данном случае можно в скобках совсем не указывать a и b?
Почему тогда в учебнике запись (a,b)
Ответы
Ответ 1
"но все работает и так" - где ж работает? Массив ведь не отсортирован. Такая compare функция возвращает случайный результат, в массиве после "сортировки" элементы будут идти в произвольном порядке. var arr = [1, 2, 3, 4, 5]; var count = 0; function compareRandom() { count++; return Math.random() - 0.5; } arr.sort(compareRandom); console.log(count); console.log( arr ); Обратите внимание на меняющееся значение count. Теоретически, такая "сортировка" может никогда не закончиться, так как два сравнения одной и той же пары чисел могут дать противоположные результаты. А, по пунктам: Да, понимаете правильно. Да, можно не указывать. var arr = [1, 2, 3, 4, 5]; var count = 0; function compareNumeric(a, b) { count++; return a - b; } arr.sort(compareNumeric); console.log(count); console.log( arr ); Во время нормальной (с compareNumeric) сортировки массива необходимо выполнить определенное количество сравнений пар элементов. В зависимости от начального расположения элементов в массиве, некоторые пары будут сравниваться несколько раз. Логика сортировки базируется на том, что повторные сравнения чисел 2 и 3 возвращают результат, показывающий, что три больше двух. Если у этих повторных сравнений результат - случайный, то как в конце концов дожны располагаться числа 2 и 3 в окончательном отсортированном массиве?
Комментариев нет:
Отправить комментарий