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