2012-03-22 4 views
9

JavaScript sort function which takes a parameter позволяет передавать функции.Как работает функция сортировки JavaScript (как алгоритм)?

Например:

var myarray=[25, 8, 7, 41] 
myarray.sort(function(a,b){return a - b}) //Array now becomes [7, 8, 25, 41] 

Как это, что код

function(a,b){ 
    return a - b 
} 

интерпретируется возноситься? Он должен быть разделен на три случая: < 0, == 0 и > 0, но как это имеет смысл, когда a и b могут быть любыми?

Спасибо!

+0

duplicate: http: //stackoverflow.com/questions/1494713/how-does-javascripts-sort-work – alishaukat

ответ

6

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

Суть в том, что вы хотите думать о «a» и «b» как о любых двух значениях. Если вы возвращаете результат «a» - «b», ваш вид идет в порядке возрастания. Если вы делаете «b» - «a», то оно находится в порядке убывания.

Удобная функция создания собственных функций сортировки состоит в том, что вы можете сравнить значения «a» и «b» после обработки их в отдельной функции. Итак, скажем, вы хотите сортировать по значениям Цельсия, но ваш массив находится только в Фаренгейте. Вы можете сделать что-то вроде:

.sort(function(a,b){ return to_fahrenheit(a) - to_fahrenheit(b);} 
+0

Это действительно здорово, как вы можете создать собственную функцию сортировки! Спасибо ! – Coffee

+0

@sch - Большое спасибо, я запомню это сейчас! Вы, ребята, самые лучшие! – Coffee

+0

делает farenheit сортирует не по Цельсию? farenheit имеет сдвинутый масштаб с другим фактором, но сорт равен. –

2

Потому что, если b больше a, оно будет меньше 0. Если a == b, оно вернет 0. В противном случае это будет положительное число.

+0

Значит, это проходит через каждую пару чисел и проверок? – Coffee

+1

это зависит от того, как реализована реализация 'sort'. –

+0

Хм, я вижу, хорошо, он более четкий. благодаря! – Coffee

1

Это проще понять на примере. Изучим каждый возможный случай:

  1. Пусть a = 10 и b = 20. Таким образом, a - b - -10, и по соглашению мы возвращаем отрицательное значение, если a < b, поэтому мы хорошие.
  2. Пусть a = 20 и b = 10. Таким образом, a - b - 10, и по соглашению мы возвращаем положительное значение, если a > b, поэтому мы по-прежнему хороши.
  3. Пусть a = 10 и b = 10. Таким образом, a - b - 0, и по соглашению мы возвращаем 0, если a == b, и все работает так, как ожидалось!

В общем: в случае если a < b, a - b всегда будет отрицательным; если a > b, a - b всегда будет положительным; и если a == b, a - b всегда будет 0, пока a и b являются целыми значениями.

+0

Большое спасибо, Оскар! он щелкнул! – Coffee

5

Функция sort будет вызывать функцию compareFunction несколько раз и переходит к пунктам a и b. Это произойдет несколько раз, пока массив не будет отсортирован.

Функция сравнения должна возвращать:

  • 0, если a == b;
  • положительное число, если a > b;
  • отрицательный номер если b < a.

Теперь давайте посмотрим на функцию в вашем коде, мы имеем a - b =:

  • 0, если a == b;
  • положительное число, если a > b;
  • отрицательный номер если b < a.

Таким образом, он возвращает ожидаемый результат, и массив будет отсортирован правильно.

Для получения дополнительной информации см. documentation.

+0

Большое вам спасибо, sch. Я получаю это сейчас, а также прочитал ссылку, очень тщательно! – Coffee

+0

Большое спасибо, я запомню это сейчас! Вы, ребята, самые лучшие! – Coffee

2

Функция принимает 2 параметра (a, b). Эта функция вычитает a из b и возвращает результат. Если возвращаемое значение
Позитивное - это такое число больше, чем б
минус - это число меньше, чем б
ZERO - а равно б

поведение отличается на основе браузера: См. Вывод, сгенерированный разными браузерами:

var numArray = [20,1,10,2,3]; 
numArray.sort(function(a,b) { 
    document.write("a = " + a + ", b = " + b + "<br />"); 
    return a-b} 
); 

output on firefox : 
a = 20, b = 1 
a = 20, b = 10 
a = 1, b = 10 
a = 2, b = 3 
a = 20, b = 2 
a = 1, b = 2 
a = 10, b = 2 
a = 10, b = 3 


output on chrome: 
a = 20, b = 1 
a = 20, b = 10 
a = 1, b = 10 
a = 20, b = 2 
a = 10, b = 2 
a = 1, b = 2 
a = 20, b = 3 
a = 10, b = 3 
a = 2, b = 3 

Надеюсь, это поможет!

3
var myarray=[25, 8, 7, 41] 
myarray.sort(function(a,b){return a - b}) //Array now becomes [7, 8, 25, 41] 

просто изменить что

var myarray=[25, 8, 7, 41] 
myarray.sort(function(a,b){console.log("comparing " + a + ", " + b);return a - b}) //Array now becomes [7, 8, 25, 41] 

после попытки выше код в консоли журнала вы увидите следующий результат

var myarray=[25, 8, 7, 41] 
 
    myarray.sort(function(a,b){console.log("comparing " + a + ", " + b);return a - b}) //Array now becomes [7, 8, 25, 41]

İŞ инте Поднял ли он, что он восходит? Он должен быть разделен на три случая: < 0, == 0 и> 0; но как это имеет смысл, когда a и b могут быть чем угодно?

ПЕРВОЕ СРАВНЕНИЕ: 25,8

Теперь, позволяет ответить на ваши сомнения о том, как он выбирает значение а, б.Когда вы запускаете код, вы видите, что первое сравнение производится между 25,8, и если результат положительный, это означает, что 8 меньше. Так что это просто переупорядочивает его до 8, 25.

ВТОРОГО СРАВНЕНИЕ: 25,7

Следующей сравнение между 25, 7 и это потому, что, если результат отрицательный, то третье число будет поставлено после 25 и сортировка трех чисел будет выполнена.

Но дело в другом, теперь в результате снова появляется положительное. Массив все же повторно заказывается до

После этого он снова выполняет тест, пока не обнаружит, что условие положительное. Итак, теперь он сравнивает 8, 7, и результат снова отрицательный.

Массив снова переупорядочиваем себя к

7, 8, 25 

ТРЕТИЙ СРАВНЕНИЯ: 25, 41

Теперь, в последнем сравнении, результат получается положительным, что означает, что 41 больше, чем 25 .

поэтому массив перестраивает себя

7,8,25,41 
0
var a = [5,2,1,3,9,6]; 

console.log(a.sort(function(a,b){console.log(a+"," +b); return a>b;})); 

Result: 
5,2 => create array [2,5] 
5,1 => need to check 2 and 1. [2,5], [1,5] 
2,1 => push 1 before 2? isOk? => OK [1,2,5] 
5,3 => need to check 1,2 with 3 before 5 [1,2,5], [3,5] 
2,3 => push 3 after 2 and before 5 => OK [1,2,3,5] 
5,9 => [1,2,3,5,9] 
9,6 => [1,2,3,5,9], [6,9] 
5,6 => [1,2,3,5,6,9] 
Смежные вопросы