Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Билеты на зачет.docx
Скачиваний:
51
Добавлен:
01.06.2015
Размер:
554.66 Кб
Скачать

28. Сортировка простым включением

29. Приоритетные очереди

30. Радикс сортировка Радикс Сортировка

Большинство методов сортировки предполагают, что ключ сортировки может быть произвольной сложности. Другими словами, не делается никаких предположений о том, насколько ключ сложен. Такие методы основываются на двух базисных операциях – сравнение ключей и обмен двух записей. Однако, во многих случаях известно, что ключ является числом в некотором диапазоне. Этим можно воспользоваться для получения более эффективного алгоритма. Методы сортировки, которые используют числовые свойства ключей, называются методамирадикс сортировки.Такие методы не просто сравнивают ключи: они обрабатывают и сравнивают ключи по частям.

Радикс сортирующие алгоритмы работают с ключами как с числами некоторого основания М, используя их отдельные цифры. К примеру, представьте себе клерка, который должен отсортировать карточки согласно номеру, находящемуся в диапазоне от 000 до 999. Один из способов это сделать – разложить их в 10 кучек: в одну кучку все карточки с номерами меньшими 100, в другую с номерами от 100 до 199 и т. д. После этого каждую кучку разделить еще на 10 кучек, с номерами 0-9, 10-19 и т.д. Подобная процедура повторяется до тех пор, пока кучки не окажутся достаточно маленькими для сортировки2. Этот простой пример демонстрирует радикс сортировку для М=10. Для компьютера более удобным представляется использовать радикс М=2 (или степени 2) вместо 10.

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

Биты

Пусть ключ представлен как бинарное число; нам необходима операция извлечения из этого ключа последовательности битов с какой-либо позиции. Пусть нам нужно обработать целые ключи лежащие между 0 и 1000. Мы можем считать, что эти ключи предоставлены как 10-ти битовые целые. В ассемблере биты извлекаются посредством побитовой операции "and"и сдвигов. Например, старшие два бита десяти-битового числа извлекаются посредством сдвига числа на 8 позиций вправо и его побитового"and"с 0000000011. В Паскале мы можем симулировать эти операции посредством использования операторов"div"и"mod". Можно также использовать операторы"shr"и"and". Например, вышеупомянутая операция может быть описана либо как (x div 256) mod 4 или как (x shr 8 and 3). Далее мы будем считать, что у нас есть некая функция bits(x,k,j:integer) для извлечения из числа х с позиции k b бит.

Вооруженные этим мы рассмотрим два метода сортировки, отличающихся друг от друга порядком просмотра ключей. Мы будем считать, что ключи достаточно длины, и стόят того, чтобы дробить их на более мелкие. Для коротких ключей можно использовать сортировку методом подсчета распределения. Как мы помним, этот метод использует линейное время для сортировки Nключей в диапазоне от 0 доN-1 и использует дополнительный массив размераN. Таким образом, если мы можем себе позволить таблицу размера, то мы можем отсортировать файл за линейное время. Радикс же сортировка становится необходимой тогда, когда ключи достаточно длины (скажем b=32).

Первый метод, который мы исследуем, обрабатывает биты слева направо. Он основывается на том факте, что цифры всегда идут по порядку: 0 всегда предшествует 1, и т.д. Такой метод называется сортировка радикс обменом.

Второй метод исследует биты в ключах справа налево. Он основан на интересном принципе, который сводит сортировку b-битного ключа к b сортировкам однобитного ключа. Этот метод называется прямаярадикссортировка.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]