Re: быстpая соpтиpовка

From
Oleg Khovayko ()
To
Alexx Ovodov
Date
2002-12-26T08:04:23Z
Area
RU.ALGORITHMS
From: Oleg Khovayko <olegh@hotpop.com>

Alexx Ovodov wrote:

Вообще говоря, все эти сортировки хорошо описаны в 3-м томе Кнута.
Том так и называется: Поиск и сортировка.
В электронном виде, по-моему, есть у Мошкова: www.lib.ru

Но судя по твоим высказываниям типа:

 > памяти очень мало, я пpогy для микpоконтpоллеpа мк51 пишy.
 > ок, поищy описание пpиведенных тобой алгоpитмов в инете
...
 >128 байт с пpямой адpесацией и 128 с косвенной адpесацией
 > pеально могy отвести байт 10-15 пpямой памяти и 40-50 косвенной

Похоже, что тебе надо использовать побитовую сортировку.
Почему именно побитовую? Отвечаю:

1. Время сортировки пропорционально N*Log(N)
2. Не требует подготовительных операций типа пре-сканирования
массива для поиска медианы.
3. Не требует дополнительной памяти для данных
4. Количество уровней рекурсии НИКОГДА не превысит количества бит
в твоем сортируемом слове - то есть уровней рекурсии будет не более 16, 
тогда как для quicksort-a возможен такой набор данных,
что число уровней рекурсии станет равно длине сортируемого массива.
У тебя в микроконтроллере стек ограничен, поэтому данное свойство
алгоритма становится очень важным.
5. Нет такого набора данных, который заваливает алгоритм в N*N,
тогда как для классического quicksort-a без доп. примочек такой
набор данных есть - это уже отсортированый массив, или же массив с 
большим количеством повторов.
6. При программировании сортировки 16-битовых чисел
на ассемблере для машины с 8-разрядной шиной (а я так понимаю, что
у тебя именно этот случай) возможен такой способ ускорения:
На последних фазах сортировки, когда сортировка идет в битах младшего 
байта, алгоритм гарантирует, что содержимое старшего байта одинаково у
всех элементов в сортируемом подблоке. Это позволяет использовать вместо
сравнения и перестановки 16-битовых int-ов сравнение/перестановку их
младших байтов, что вдвое снизит загрузку 8-битового процессора на
этих этапах сортировки. То есть это при прочих равных даст где-то 20%
выигрыша в скорости.

Про то, как устроена пробитовая сортировка,
и как ее реализовать, читай тут:

http://www.codenet.ru/progr/alg/11.php
http://home.pride-net.ru/~pkolledz/nepi/departments/inf_sub_fac/str_alg/7.html
http://jsf.boom.ru/programm/algoritm/index.htm
http://www.helloworld.ru/texts/comp/algor/data/sfaq/index.htm

--- ifmail v.2.15dev5
 * Origin: Demos online service (2:5020/400)