Страницы

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

суббота, 11 января 2020 г.

JavaScript метод sort() и Math.random()

#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 в окончательном отсортированном массиве?

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

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