Как работает Javascript sort()?
Как следующий код сортирует этот массив по порядку номеров?
var array=[25, 8, 7, 41]
array.sort(function(a,b){
return a - b
})
Я знаю, что если результат вычисления...
Меньше 0: "a" сортируется как более низкий индекс, чем "b".
Ноль: "a" и "b" считаются равными, и сортировка не производится.
Больше 0: "b" сортируется как более низкий индекс, чем "a".
Вызывается ли функция обратного вызова сортировки массива много раз в течение сортировки?
Если это так, я хотел бы знать, какие два числа передаются в функцию каждый раз. Я предположил, что сначала взял "25" (а) и "8" (б), а затем "7" (а) и "41" (б), так что:
25 (a) - 8 (b) = 17 (больше нуля, поэтому сортируйте "b", чтобы иметь более низкий индекс, чем "a"): 8, 25
7 (a) - 41 (b) = -34 (меньше нуля, так что сортируйте "a", чтобы иметь более низкий индекс, чем "b": 7, 41
Как два набора чисел затем сортируются по отношению друг к другу?
Пожалуйста, помогите борющемуся новичку!
Ответы
Ответ 1
Вызывается ли функция обратного вызова сортировки массива много раз в течение сортировки?
да
Если это так, я хотел бы знать, какие два числа передаются в функцию каждый раз
Вы можете узнать себя с помощью:
array.sort((a,b) => {
console.log('comparing ${a},${b}');
return a > b ? 1
: a === b ? 0
: -1;
});
РЕДАКТИРОВАТЬ
Это вывод, который я получил:
25,8
25,7
8,7
25,41
Ответ 2
У интерпретатора JavaScript есть своего рода алгоритм сортировки, встроенный в него. Он вызывает функцию сравнения несколько раз во время операции сортировки. Количество вызовов, вызываемых функцией сравнения, зависит от конкретного алгоритма, сортируемых данных и порядка, который он находится перед сортировкой.
Некоторые алгоритмы сортировки плохо работают на уже отсортированных списках, потому что они заставляют их делать гораздо больше сравнений, чем в типичном случае. Другие хорошо справляются с предварительно отсортированными списками, но имеют другие случаи, когда их можно "обмануть" в плохое выполнение.
Существует много алгоритмов сортировки, которые не используются, поскольку ни один алгоритм не идеален для всех целей. Два наиболее часто используемых для общей сортировки: Quicksort и merge sort. Quicksort часто является более быстрым из двух, но сортировка слияния имеет некоторые приятные свойства, которые могут сделать его лучшим общим выбором. Сортировка слияния stable, а Quicksort - нет. Оба алгоритма параллельны, но способ сортировки слияния делает параллельную реализацию более эффективной, при прочих равных условиях.
Ваш конкретный интерпретатор JavaScript может использовать один из этих алгоритмов или что-то еще полностью. ECMAScript стандарт не указывает, какой алгоритм соответствует выполнению использовать. Он даже явно отрицает необходимость стабильности.
Ответ 3
Сравниваются пары значений, по одной паре за раз. Пара, которые сравниваются, представляет собой деталь реализации - не предполагайте, что они будут одинаковыми в каждом браузере. Обратный вызов может быть любым (так что вы можете сортировать строки или римские цифры или что-то еще, где вы можете найти функцию, которая возвращает 1,0, -1).
Одна вещь, которую следует учитывать при сортировке JavaScript, заключается в том, что она не гарантируется стабильностью.
Ответ 4
Является ли функция обратного вызова сортировки массива много раз во время сортировки?
Да, это точно. Обратный вызов используется для сравнения пар элементов в массиве по мере необходимости, чтобы определить, в каком порядке они должны быть. Эта реализация функции сравнения не является нетипичной при работе с числовой сортировкой. Подробности в спецификация или некоторые другие более читаемые сайты.
Ответ 5
Является ли функция обратного вызова сортировки массива много раз во время сортировки?
Так как это сортировка сортировка, учитывая N элементов, функция обратного вызова должна вызываться в среднем (N * Lg N) раз для быстрого типа, например Quicksort. Если используемый алгоритм похож на Bubble Sort, тогда функция обратного вызова будет вызвана в среднем (N * N) раз.
Минимальное количество вызовов для сортировки сортировки - это (N-1), и это только для обнаружения уже отсортированного списка (т.е. рано в Bubble Sort, если не происходит смены).
Ответ 6
var array=[25, 8, 7, 41]
array.sort(function(a,b){
console.log('a = ${a} , b = ${b}');
return a - b
});
ВЫХОД
- а = 8, б = 25
- а = 7, б = 8
- а = 41, б = 7
- а = 41, б = 8
- а = 41, б = 25
в моем браузере (Google Chrome версии 70.0.3538.77 (официальная сборка) (64-разрядная версия)) в первой итерации аргумент a является вторым элементом в массиве, а аргумент b является первым элементом массива.