it-swarm.com.ru

Как работает Javascript sort ()?

Как следующий код сортирует этот массив по порядку номеров?

var array=[25, 8, 7, 41]

array.sort(function(a,b){
  return a - b
})

Я знаю, что если результат вычисления ...

Меньше: "a" сортируется как более низкий индекс, чем "b".
Zero: "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

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

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

69
cw84

Функция обратного вызова сортировки массива вызывается много раз в течение сортировки?

Да

Если это так, я хотел бы знать, какие два числа передаются в функцию каждый раз

Вы можете узнать себя с помощью:

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
41
OscarRyz

В интерпретатор JavaScript встроена какая-то реализация алгоритм сортировки . Он вызывает функцию сравнения несколько раз во время операции сортировки. Количество вызовов функции сравнения зависит от конкретного алгоритма, сортируемых данных и порядка их сортировки.

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

Существует много общих алгоритмов сортировки, потому что ни один алгоритм не подходит для всех целей. Двумя наиболее часто используемыми для общей сортировки являются Quicksort и сортировка слиянием . Быстрая сортировка часто выполняется быстрее, но сортировка слиянием имеет некоторые свойства Nice, которые могут сделать ее лучшим выбором. Сортировка слиянием - стабильная , а сортировка с сортировкой - нет. Оба алгоритма являются параллелизуемыми, но способ сортировки слиянием делает параллельную реализацию более эффективной, при прочих равных условиях.

Ваш конкретный интерпретатор JavaScript может использовать один из этих алгоритмов или что-то еще целиком. ECMAScript стандарт не указывает, какой алгоритм должна использовать соответствующая реализация. Это даже явно дезавуирует потребность в стабильности.

37
Warren Young

Пары значений сравниваются по одной паре за раз. Сравниваемые пары являются деталями реализации - не думайте, что они будут одинаковыми в каждом браузере. Обратный вызов может быть любым (поэтому вы можете сортировать строки или римские цифры или что-то еще, где вы можете придумать функцию, которая возвращает 1,0, -1).

Следует помнить о том, что JavaScript должен быть стабильным.

10
Nosredna

Функция обратного вызова сортировки массива вызывается много раз в течение сортировки?

Да, именно так. Обратный вызов используется для сравнения пар элементов в массиве по мере необходимости, чтобы определить, в каком порядке они должны быть. Эта реализация функции сравнения не является нетипичной при работе с числовой сортировкой. Подробности на спецификации или на некоторых других более читаемых сайтах.

5
T.J. Crowder

Вызывается ли функция обратного вызова сортировки массива много раз в течение сортировки?

Поскольку это сортировка сравнения, учитывая N элементов, функцию обратного вызова следует вызывать в среднем (N * Lg N) раз для быстрой сортировки, например Quicksort . Если используемый алгоритм что-то вроде Bubble Sort , то функция обратного вызова будет вызываться в среднем (N * N) раз.

Минимальное количество вызовов для сортировки сравнения составляет (N-1), и оно предназначено только для обнаружения уже отсортированного списка (т. Е. На ранней стадии Bubble Sort, если не происходит перестановок).

4
Adisak

запустите этот код. Вы можете увидеть точный пошаговый процесс сортировки от начала до конца.

var array=[25, 8, 7, 41]
var count = 1;
array.sort( (a,b) => { 
console.log(`${count++}). a: ${a} | b: ${b}`);
return a-b;
});
console.log(array);
0
Tinu Mathai