Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   про метод sort() (https://javascript.ru/forum/dom-window/14102-pro-metod-sort.html)

Иваннн 29.12.2010 17:14

про метод sort()
 
Доброго времени суток! В библии пользователя(Гудман) и подробном руководстве(носорог) по javascript действие метода sort() массива разъясняется так: берется две соседних ячейки и сравниваются. Но в таком масиве [4,5,6,3] каким образом тройка станет вперед, ведь она никак не является соседней для четверки? И еще при использовании аргумента-функции, результатом которой является 1,-1или 0 почему в подробном руководстве говорится, что данная функция запустится всего одлин раз, ведь она должна запускатся при каждом сравнении пар значений?

Kolyaj 29.12.2010 17:27

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

Иваннн 31.12.2010 08:08

А по подробнее про алгоритм?
 
А по подробнее про алгоритм?

Kolyaj 31.12.2010 08:24

http://ru.wikipedia.org/wiki/Quicksort

B@rmaley.e><e 31.12.2010 13:55

Цитата:

Сообщение от Kolyaj
При сортировке используется алгоритм быстрой сортировки

Не везде.
V8: qsort с выбором опоры как среднего из трех и переходом на сортировку вставками для массивов размером меньше 10 (array.js:678).

Spidernonkey: mergesort (jsarray.c:1962).

JavaScriptCore: в коде есть такой комментарий:
Цитата:

// "Min" sort. Not the fastest, but definitely less code than heapsort
// or quicksort, and much less swapping than bubblesort/insertionsort.
(ArrayPrototype.cpp:506)
Как я понял, это сортировка выбором.

Увы, но про Carakan и Charka ничего сказать не могу :-(

JSTalker 06.01.2011 07:29

Цитата:

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

Т.е. сам sort вызывает эту функцию много (сколько нужно) раз? А программисту достаточно указать один раз sort(foo())?

Вот что сам Флэнэган пишет по этому поводу:

"Для сортировки в какомлибо ином порядке, отличном от алфавитного, можно
передать методу sort() в качестве аргумента функцию сравнения. Эта функция
устанавливает, какой из двух ее аргументов должен присутствовать раньше в от
сортированном списке. Если первый аргумент должен предшествовать второму,
функция сравнения возвращает отрицательное число. Если первый аргумент
в отсортированном массиве должен следовать за вторым, то функция возвращает число, большее нуля. А если два значения эквивалентны (т. е. порядок их рас
положения не важен), функция сравнения возвращает 0."

var a = [33, 4, 1111, 222];
a.sort(); // Алфавитный порядок: 1111, 222, 33, 4
a.sort(function(a,b) { // Числовой порядок: 4, 33, 222, 1111
return a-b; // Возвращает значение < 0, 0, или > 0
}); // в зависимости от порядка сортировки a и b


Откуда тут вообще взялись a и b? Они же нигде явно не определялись.
Понятно, что они как то берутся из массива, но как?

Gvozd 06.01.2011 09:12

Цитата:

Сообщение от JSTalker
Откуда тут вообще взялись a и b? Они же нигде явно не определялись.
Понятно, что они как то берутся из массива, но как?

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

JSTalker 06.01.2011 23:26

Gvozd,
ух-ты!
Первый раз вижу, чтоб вызывающая функция (sort) передавала (задавала) функции-аргументу (foo()) аргументы...
Алгоритм конечно замысловатый... :blink:

Gvozd 06.01.2011 23:47

JSTalker,
у вас сильные пробелы в базовых знаниях

function func1(funcname, funcparam){
funcname(funcparam);
}
func1(alert,'olo-lo');

Kolyaj 06.01.2011 23:51

JSTalker,
скобочки-то лишние уберите уже наконец.
sort(foo); // а не sort(foo())


Часовой пояс GMT +3, время: 06:36.