Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Поразрядная сортировка.doc
Скачиваний:
1
Добавлен:
10.07.2019
Размер:
449.54 Кб
Скачать

10.4. Трехпутевая поразрядная быстрая сортировка

Еще одна возможность приспособить быструю сортировку для поразрядной сортировки MSD заключается в использовании трехпутевого разделения ключей по старшим байтам, переходя к следующему байту только в среднем подфайле (в которою содержатся ключи, старшие байты которых равны старшему байту разделяющего элемента). Реализация этого метода не представляет трудностей (по существу, достаток но описания из одного предложения плюс код из программы 7.5, обеспечивающий трехпутевое разделение), а сам метод легко адаптируется к различным ситуация* Программа 10.3 содержит полную реализацию этого метода.

По существу, выполнение такой трехпутевой поразрядной быстрой сортировки равносильно сортировке файла по старшим разрядам ключей (с использованием метода быстрой сортировки) с последующим применением в режиме рекурсии этого ж; метода к остальной части ключей. При сортировки строк этот метод выглядит предпочтительнее в сравнении с обычной быстрой сортировкой и поразрядной сортировкой MSD. Разумеется, его можно рассматривать как гибрид двух указанных алгоритмов.

Сравнивая трехпутевую поразрядную быструю сортировку со стандартной поразрядной сортировкой MSD мы можем отметить, что она разбивает файл всего лишь на три части, так что она не использует всех преимуществ быстрого мно-гопутевого разбиения, особенно на ранних стадиях сортиров-ки. С другой стороны, на поздних стадиях поразрядной сор-тировки MSD появляется множество пустых корзин, но в то же время поразрядная быстрая сортировка хорошо приспо-соблена для случаев дублированных ключей, ключей, принимающих значения в узких диапазонах, файлов небольших размеров и многих других случаев, в условиях которых по-фядная сортировка MSD выполняется медленно. Особо важное значение приобретает то обстоятельство, что подобного рода разбиение хорошо подходит для случаев проявления различного рода закономерностей в разных частях ключа. Более того, для нее не нужны никакие вспомогательные фаилы. В противовес всем этим достоинствам можно поставить тот факт, что требуются дополнительные операции обмена, чтобы реализовать многопутевое разбиение с помощью трехпутевого разбиения, когда число под файлов велико. На рис. 10.11 приводится пример применения этого метода для сортировки совокупности трехбуквенных слов, представленныхных на рис. 10.7.

Рисунок 10.12 отражает структуру рекурсивных вызовов. Каждый узел соответствует в точности трем рекурсивным вызовам: но ключам с меньшим значением первого байта (левый потомок), по ключам с тем же значением первого байта (средний потомок) и по ключам с большим значением первого байта (правый потомок).

Когда сортируемые ключи соответствуют абстракции из эаздела 10.2, стандартную быструю сортировку (а также все угие методы сортировки, рассмотренные в главах 6—9) можно рассматривать как поразрядную сортировку MSD, поскольку функция сравнения осуществляет доступ сначала к наиболее значащей части ключа (см. упражнение 10.3). Например, если в качестве ключей выступают строки, функция сравнения должна осуществлять доступ только к старшим байтам, если они попарно различаются, и к двум байтам, если первые байты совпадают, а вторые байты различны, и т.д. Таким образом, стандартный алгоритм автоматически затрачивает некоторую часть выигрыша в производительности, в погоне за которой мы используем поразрядную сорти-эовку MSD (см. раздел 7.7). Существенное различие заключается в том, что стандартный алгоритм не может едпринять никаких действий, когда старшие байты равны.

Действительно, программу 10.3 можно рассматривать как способ метода быстрой ее тировки запоминать все, что ему стало известно о старших цифрах элементов после их использования в процедуре разделения файла на несколько частей. В малых файлах, для которых большая часть операций сравнения была выполнена в процессе сортировки, существует большая вероятность того, что многие старшие байты совпадают. Стандартный алгоритм обязан просмотреть все эти байты в рамках каждог операции сравнения, в то время как трехпутевой алгоритм не делает этого.