2009-09-29 1 views
54

Как следующий код сортирует этот массив в числовом порядке?Как работает Javascript()?

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

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

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

Менее 0: «а» сортируется быть ниже, чем индекс «Ъ».
Zero: «a» и «b» считаются равными, и сортировка не производится.
Больше 0: «b» сортируется как нижний индекс, чем «a».

Является ли функция обратного вызова сортировки массива многократно вызываемой в ходе сортировки?

Если да, то я хотел бы знать, какие два числа передаются в функцию каждый раз. Я предположил, что сначала они взяли «25» (a) и «8» (b), а затем «7» (a) и «41» (b), поэтому:

25 (a) - 8 (b) = 17 (больше нуля, поэтому сортировка «b» будет ниже индекса «a»): 8, 25

7 (a) - 41 (b) = -34 (меньше нуля, поэтому сортировка " а»быть ниже индекс, чем„Ъ“:?! 7, 41

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

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

+1

Надеюсь, это вызывает некоторые искажения! – cw84

ответ

32

Является ли функция обратного вызова сортировки массива многократно вызываемой в ходе сортировки?

Да

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

Вы могли бы узнать вашу собственную личность с:

array.sort((a,b) => { 
    console.log(`comparing ${a},${b}`); 
    return a > b ? 1 
       : a === b ? 0 
         : -1; 
}); 

E DIT

Это выход я получил:

25,8 
25,7 
8,7 
25,41 
+7

скорее сделайте console.log для firebug или html. DIV-элемент .innerHTML + = "сравнение" + a + "," + b + "\ n"; – Joshua

+0

@Joshua: Определенно – OscarRyz

+2

Помните, что это вики-подобный сайт, и мы можем редактировать другие ответы, чтобы сделать их лучше :) –

3

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

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

34

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

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

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

Ваш конкретный переводчик JavaScript может использовать один из этих алгоритмов или что-то еще полностью. Должен использоваться стандарт ECMAScriptdoes not specify which algorithm. Он даже явно отрицает необходимость стабильности.

+1

FWIW, базовый Quicksort - один из алгоритмов, которые могут быть «обмануты» неудачно. В простой форме он имеет производительность O (N^2) для списков, которые либо уже отсортированы, либо точно изменены. Большинство алгоритмов Quicksort для библиотек имеют ряд неочевидных оптимизаций, которые помогают избежать этих распространенных сценариев наихудшего случая. – Adisak

+2

JavaScriptCore на самом деле использует дерево AVL для сортировки, так как необходимо детерминировать поведение перед функциями компаратора, которые изменяют отсортированный массив. – olliej

9

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

Одна вещь, которую следует учитывать при сортировке JavaScript, заключается в том, что она не гарантируется стабильностью.

2

Является ли функция обратного вызова сортировки массива много раз повторяющейся в ходе сортировки?

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^