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