Flash ActionScript и сортировка массивов
Сегодня возникла необходимость быстрой сортировки массива в программе на ActionScript. Естественно, руки потянулись использовать стандартный Array.sort(), особенно, учитывая то, что по результатам сортировки массива мне необходимо сделать соответствующие перестановки MovieClip’ов по уровням z-индексирования, т.к. Array.sort() поддерживает пользовательскую функцию сравнения элементов.
Из-за природного недоверия решил сделать небольшой тест для встроенной функции сортировки класса Array. Результаты удивили. Оказалось, что стандартный метод использует пузырьковую сортировку. Печально. Ну да ладно. Пришлось сделать быструю сортировку (quick sort).
При сортировке массива из 10 элементов в обратном порядке встроенный метод Aaray.sort() с указанием пользовательской функции сделал 49 сравнений элементов.
Да, это худший вариант для алгоритма bubble sort (когда исходный массив имеет обратную сортировку относительно конечного), но это не реабилитирует разработчиков Flash - могли бы встроить и Quick Sort, благо - алгоритм несложный.
function quickSort(a, left, right) {
if (left == undefined) left = 0;
if (right == undefined) right = a.length-1;
var i = left;
var j = right;
var step = -1;
var condition = 1;
if (left >= right) {
return;
}
do {
if (condition == (a[i] > a[j])) {
// here
var foo = a[j];
a[j] = a[i];
a[i] = foo;
_root.shiftNum++;
foo = j;
j = i;
i = foo;
step *= -1;
condition = !condition;
}
j += step;
} while (j != i);
quickSort(a, left, i-1);
quickSort(a, i+1, right);
}
Там, где комментарием “here” отмечено место в коде, я просто вставил обработчик перестановок MovieClip’ов с помощью MovieClip.SwapDepths() вот и все :)
К слову… основные алгоритмы сортировки.
Спасибо flasher.ru за то, что избавил меня от написания алгоритма быстрой сортировки на AS :)
Дополнение от 26 мая:
По факту я все равно использовал модифицированную версию алгоритма, которая в качестве опорных элементов выбирает не крайние элементы в диапазонах, а средние, что минимизирует количество рекурсивных вызовов и не приводит к худшему сложному случаю, когда на вход функции подается уже отсортированный массив.
Дополнение от 30 июня:
Случайно попалось на глаза - визуализация работы алгоритмов сортировки.

D выразил(а) мнение:
Женя ты с кем разговариваешь :)
Link | May 22nd, 2008 at 21:45
opilkin выразил(а) мнение:
в лабе все так разговаривают? :)
Link | May 23rd, 2008 at 12:07
3eka облек(ла) свое умозаключение в форму комментария:
Ребят, это ж несложные вещи, че вы в самом деле ? ;)
Link | May 23rd, 2008 at 12:16
D облек(ла) свое умозаключение в форму комментария:
opilkin а причем тут лаба ?
Link | May 24th, 2008 at 21:23
tzar облек(ла) свое умозаключение в форму комментария:
Прикольно. Не ожидал от разработчиков Flash самого тупого метода сортировки (кстати, а как ты узнал, что там тупо bubble sort?). Вот из-за отсутствия желания работать над быстродействием и возникают подвисания Flash-элементов на страницах сайтов :(
Link | May 25th, 2008 at 18:51
3eka пошутил(а):
2Tzar: по количеству сравнений элементов при вызове моего обработчика сравнений, переданного в Array.sort()
Link | May 26th, 2008 at 01:18
Андрей подумал(а):
Самый тупой метод это вот: http://ru.wikipedia.org/wiki/глупая сортировка
Кстати более быстрые методы (меньше итераций чем кол-во элементов массива в квадрате) требуют больше памяти. Может они заботились о сохранении памяти при сортировке больших массивов.
Link | May 26th, 2008 at 11:39
3eka написал(а):
Глупая сортировка - это вообще жесть какая-то. Я быстрее отсортирую вручную ;)
Это больше похоже на реализацию bubble sort’а индусами ;))
Во Flash массивы редко бывают очень большими, а в распоряжении flash-плеера довольно много памяти. Гораздо больше памяти расходуется на медиа-данные.
Т.ч., думаю, они просто не парились и оставили разработчикам самим писать нормальную сортировку на AS. Хотя, будучи написанной на CPP, а не на AS, она бы работала в разы быстрее.
Link | May 26th, 2008 at 11:54
Индус сказал(а):
зашем руеся на наша сарирофка насяльника мэ, эта луший сатирофка в мире !
Link | May 27th, 2008 at 16:38
Яски написал(а):
>>Может они заботились о сохранении памяти при сортировке больших массивов.
При грвнице максимального выполнения кадра в 15 секунд такие массивы просто отсортировать не возможно.
Link | June 20th, 2008 at 09:14
3eka отморозил(а):
> При границе максимального выполнения кадра в 15 секунд такие массивы просто отсортировать не возможно.
Эээ… что-то не понял. Ведь вся сортировка, если она не разбита специально на итеративное выполнение по кадрам (обычно такое делается для отображения прогресса), выполняется за один такт счетчика кадров. Т.е. наступило событие onEnterFrame, мы вызвали функцию сортировки, она отработала и потом выполнение продолжилось. Если функция работала слишком долго, в этом месте ролик получит резкий провал по FPS.
или имелось ввиду что-то другое?
Link | June 20th, 2008 at 10:35