Подтвердить что ты не робот

Как работает 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

Как два набора чисел затем сортируются по отношению друг к другу?

Пожалуйста, помогите борющемуся новичку!

4b9b3361

Ответ 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 является первым элементом массива.