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

540
20 февраля 2017, 19:09

Изучаю 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)

Answer 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. Теоретически, такая "сортировка" может никогда не закончиться, так как два сравнения одной и той же пары чисел могут дать противоположные результаты.

А, по пунктам:

  1. Да, понимаете правильно.
  2. Да, можно не указывать.

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

READ ALSO
Добавление мини-игр на сайт [требует правки]

Добавление мини-игр на сайт [требует правки]

Добрый день! У меня есть сайт, на который я хочу добавить парочку мини-игрНа сайте есть баланс, так вот, как можно реализовать игру "Монетка"...

284
Вывод номера по выбору города

Вывод номера по выбору города

Как можно реализовать, чтобы при выборе определенного города, выводился определенный номер ? Я понимаю что через JS, может кто с кодом помочьЗаранее...

599
setTimeout & pop-up modal

setTimeout & pop-up modal

Привет! Новичок, практикуюсь, пишу чат на JS

277
Несколько json_encode в ajax запросе

Несколько json_encode в ajax запросе

Нужно вывести содержимое двух массивов с помощью ajaxпоявляется ошибка в js при распарсивании массива Unexpected token { in JSON at position 19

336