|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Обменная поразрядная сортировка
Вместо того чтобы сравнивать между собой два ключа, в этом методе проверяется, равны ли нулю или единице отдельные биты ключа от старшего бита к младшему. Рассмотрим метод, напоминающий метод быстрой сортировки, но использующий двоичное представление ключей. Здесь, вместо арифметических сравнений ключей проверяется, равны ли нулю или единице отдельные биты ключей. В общих чертах идея метода следующая: I этап. Файл сортируется по старшему значащему биту ключа так, что все ключи, начинающиеся с нуля, оказываются перед всеми ключами, начинающимися с единицы. Для этого надо найти самый левый ключ ki, начинающийся с единицы и самый правый kj, начинающийся с нуля, после чего, записи Ri и Rjменяются местами. Процесс повторяется до тех пор, пока не станет i>j. II этап. Обозначим через F0 множество элементов, начинающихся с нуля, а через F1 – остальные. Применим к F0 обменную поразрядную сортировку (начинаем теперь со второго бита слева) до тех пор, пока множество F0 не будет полностью отсортировано. Затем проделываем то же самое с множеством F1. Как и при быстрой сортировке, для хранения информации о подфайлах, ожидающих сортировку, можно воспользоваться стеком. Стратегию формирования стека здесь применяют другую: В стек помещать не больший из подфайлов, а правый подфайл, при этом элементы стека (r,l) означают, что подфайл с правой границей r ожидает сортировку по биту l, левую границу можно не запоминать, она всегда задана неявно, так как файл обрабатывается слева на право.
Алгоритм: Записи от 1-й до N-й R1,R2,…,RNпереразмещаются на том же месте. После завершения сортировки их ключи будут упорядочены k1≤…≤kn Предполагается, что все ключи – это m-разрядные двоичные числа: а1,а2,…,аm.
R1 [Начальная установка.] Опустошить стек, установить l←1, r←N,b←1. R2 [Начать новую стадию.] Сортируется подфайл записей со следующими границами: Rl≤…≤Rrпо биту b. По смыслу алгоритма l≤r; если r=l, то перейти к R10, в противном случае i←l,j←r. R3 [Проверить k i на единицу.] Проверить бит b ключа k i на единицу. Если (ki)b=1, то перейти к шагу R6. R4 [Увеличить i.] Если i≤j, то возвратиться к R3, иначе к шагу R8. R5 [Проверить k j+1 на ноль.] Проверяется бит b ключа kj+1. Если (kj+1)b=0, то перейти к шагу R7. R6 [Уменьшить j.] Уменьшить j на 1. j←j-1.Если i≤j, то перейти к шагу R5, иначе к R8. R7 [Поменять местами записи Riи Rj+1. ] Поменять местами Ri и Rj+1, затем перейти к шагу R4. R8 [Проверить особые случаи.] К этому моменту стадия разделения завершена, i=j+1, бит b ключей от kl до kj равен нулю, а бит ключей от ki до kr равен единице. Увеличить b на 1. Если b<m,где m – число бит, или меньше, то перейти к шагу R10. Это значит, что подфайл Rl…Rr отсортирован. Если в файле не может быть равных ключей, то такую проверку можно не делать. Иначе, если j<1 или j=r, возвратиться к шагу R2 (все просмотренные биты оказались равными соответственно единице или нулю). Если j=l, то увеличить l на 1 и перейти к шагу R2 (встретился только один бит, равный нулю). R9 [Поместить в стек.] Поместить в стек пару (r,b), затем установить r←j и перейти к R2. R10 [Взять из стека.] Если стек пуст, то сортировка закончена, иначе установить l←r+1, взять из стека элемент (r’,b’), установить r←r’,b←b’ и возвратиться к шагу R2. Для хранения “информации о границах” подфайлов, ожидающих сортировки мы воспользуемся стеком. Вместо того, чтобы сортировать в первую очередь наименьший из подфайлов, удобно продвигаться слева направо, т.к. размер стека в этом случае никогда не превзойдёт числа битов в сортируемых ключах.
8. Сортировка. Методы выбора и слияния. Простой, квадратичный выбор. Выбор из дерева. Двухпутевое слияние. Метод слияния списков. Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.004 сек.) |