· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.A&O —› Вопрос по сортировке

<< . 1 . 2 . 3 . >>

Посл.отвђт Сообщенiе


Дата: Янв 17, 2004 23:01:29

Криса, как алгоритмизатора я уважаю не слишком...
sorry за offtop.. я вот думаю.. а чего это он в статье про пакеры себя автором написал? может и здесь так?


Дата: Янв 17, 2004 23:05:04

а чего это он в статье про пакеры себя автором написал?

В какой статье?


Дата: Янв 17, 2004 23:07:04

volodya
У Криса в книге приводится диаграмма сравнения быстрой и линейной сортировки. Так вот на 2 000 000 ( а именно такие объемы в моей задаче, причем в цикле ) чисел линейная сортировка в 250 раз быстрее.!!!
А вообще мне надо приспособить все это дело под float( пока обхожусь qsort), но как это сделать без выделения гигантского объема памяти не соображу.


Дата: Янв 17, 2004 23:21:18

чисел линейная сортировка в 250 раз быстрее

Не всему, что пишут стоит верить.
Ты меня смутил. Сейчас смотрю Кнута...
А по этому поводу что скажешь:
http://www.ee.technion.ac.il/courses/044268/lectures/06_LinearSort.pdf

Кроме того, опять путаница в терминах.
Упоминают:

Линейная сортировка(сортировка отбором).

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


Так это что - сортировка выбором? Если да - так она медленне пузырька и время неустойчиво... Словом, пните меня, я окончательно запутался :(((


Дата: Янв 18, 2004 00:25:20

volodya
т.е., в худшем случае это O(n*2)?
AFAIK, O(n*2) тоже считается O(n).


Дата: Янв 18, 2004 00:45:43

HeDiN
Линейная сортировка быстрее только если среди сортируемых элементов очень много повторяющихся. А то что у Криса линейная сортировка оказалась в 250 раз быстрее означает лишь что он сортировал word'ы, которые могут иметь всего 65536 различных значений. Вообще у Кнута она называется "сортировка подсчетом".
volodya
Пнуть нужно тех кто ее так назвал и не сказал почему. Комичество обменов в ней действительно линейно зависит от числа элементов, но вот сравнений n^2/2. Если обмен более дорогая операция чем сравнение, то эта сортировка будет быстрее пузырьковой.


Дата: Янв 18, 2004 01:06:47

volodya
Ну сами же линк даванли. Которую он у f0dder'а "перевел".


Дата: Янв 18, 2004 02:08:00 · Поправил: merlin

Извиняюсь что врезаюсь по середине, но...
LinearSort есть не что иное как BucketSort, который
в свою очередь проходит эволюцию и преврощяетса
в RadixSort.
Все три вида базируютса на одном веселом принципе
который катет очен круто с целыми числами. Но как
только нецелые числа входят в игру всё очен усложняетса.
Имплементациа становитса очен (дажэ слишком) сложной.

Насчёт того что алгоритм эфективен только когда числа
повторяютса то эта не совсем правильно. Он эфективен когда
значения находятса в определёном диапазоне.

А вот насчёт пузырьков. Хммм.... Что можэт быть медленей пузырька? :)

Мой совет будет оставатса с надёжным QuickSort-ом, или реализовать
более сложный HeapSort (который можэт сработает быстрей).
Если найдутса силы реализовать RadixSort с нецелыми, будет
очень интересно взглянут на это дело.


Дата: Янв 18, 2004 05:55:34

HeDiN
описывается очень "соблазнительный" алгоритм

Каспер ГОНИТ... :)

Мои собственные эксперименты показали как раз обратный результат...
В отличие от всех остальных замеров в этой книге, здесь отсутствуют
всякие упоминания об использованной реализации quicksort...
Так что очень вероятно, что 250 - высосано из пальца :)
Скорее всего, он написал этот отрывок чтобы "попонтоваться":
"этот велосипед я изобрел еще в школе"... :))

Quantum
AFAIK, O(n*2) тоже считается O(n).

Это volodya так обозначает N в квадрате.
И это подвело его в другом топике... :)

Black_mirror
означает лишь что он сортировал word'ы

вот-вот. отсутствие описания условий тестирования означает,
что результат был известен заранее :)

Вообще у Кнута она называется "сортировка подсчетом"

У Кнута так называется квадратичный алгоритм
подсчета числа меньших ключей...

merlin
Что можэт быть медленей пузырька? :)

Может кое-что... :)
У Кнута описан кубический алгоритм, для которого
самая короткая программа (оптимизация по размеру, однако :)

А еще есть т.н. StoogeSort.
Это рекурсивный алгоритм. Идея проста.
Если число сортируемых элементов больше двух, то отсортировать:
сначала первые 2/3 массива, потом вторые 2/3, и снова первые 2/3.
Алгоритм очень похож на quicksort, только делает три рекурсивных вызова.
Зато за счет того что разбиение делается таким образом,
глубина рекурсивных вызовов заведомо ограничена логарифмом от N.


Дата: Янв 18, 2004 10:22:37

Наверное, Крис воспользовался штатной функцией qsort из "stdlib.h".
А вообще среди участников форума пробегала инфа, что кто-то имеет контакты с Крисом. Может спросить у самого автора?


Дата: Янв 18, 2004 11:46:07 · Поправил: johnfound

Мои 2 копейки: :)

"Сортировка подсчетом" я пользоваль для сортировки байтов и от действительно работает очень быстро. И написать его на ассемблере достаточно просто. Например можно подумать изпользовать его для сортировки текста... (но ето я не делал)
А вот и мoя реализация quicksort-а из дистрибуции Fresh. Он написан чтобы сортировать произвольные статические масивы:

_854035926__qsort.rar


Дата: Янв 18, 2004 15:58:29

@captain_cobalt
Было бы интересно посмотреть на этот кубический
алгоритм. Ведь то пузирьки занимают всего несколько
строк в С (что можэт быть короче?).

А этот StoogeSort это специализированый случай Quick-а,
что доказывает что быстрее чем O(n*logn) он работать не сможэт,
вообщем как и любой другой "сравнивающий" алгоритм, но
помедленей сможэт! Полное доказателство можно увидет на
линке который дал Володя.

Чтобы преодолеть баръер O(n*logn) нужно использовать
"несравнивающий" алгоритм, типа Radix-a, который начинает
жирать память (и не всегда применим), но зато скорость достигает O(n).


Дата: Янв 18, 2004 17:07:58

merlin
Было бы интересно посмотреть на этот кубический
алгоритм. Ведь то пузирьки занимают всего несколько
строк в С (что можэт быть короче?).


Алгоритм такой:
	->x

Начинаем в начале массива.
Сравниваем два соседних элемента.
Если по порядку - продвигаемся на один элемент вперед.
Иначе меняем их местами и сдвигаемся на шаг назад.
Повторяем пока не доберемся до конца массива.

Весит 8 команд MIX-ового ассемблера...

А этот StoogeSort это специализированый случай Quick-а...

Рекомендую помедитировать над ним,
если не понятно в чем прикол :)))

HeDiN
сортировки... 2 000 000 ( а именно такие объемы в моей задаче, причем в цикле )

Вернейший признак того, что на самом деле тебе нужно
либо упорядоченное дерево, либо приоритетная очередь...


Дата: Янв 18, 2004 18:20:49

То есть реализовать HeapSort. :)


Дата: Янв 18, 2004 21:08:37

HeDiN

Крис в нашей группе. Разумеется, я могу у него спросить все, что посчитаю нужным.

S_T_A_S_

Ох, ты прав. Кстати, меня на "ты", а не на "вы". Извини.

captain cobalt
Black_mirror
merlin

Спасибо!

<< . 1 . 2 . 3 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.050