8.3. Сортировка с помощью дерева
Все способы сортировок основаны на многократном просмотре массива записей и выполнении определенных операций над ними. Можно ли улучшить временные характеристики сортировок? Ответ положителен, если за единичный просмотр массива извлекать больше информации. Для этого следует сортируемый массив S представить в виде нелинейной структуры типа двоичного (бинарного) дерева D. На рисунке показан такой граф D для массива S из n<16 элементов. В кружках размещены элементы массива: 9 14 8 1 5 4 9 12 3 17 1 3. Натуральными числами, начиная от 1, сверху вниз по уровням и слева направо на одном уровне пронумерованы все вершины дерева. Эти номера (адреса) проставлены около вершин.
У бинарного дерева имеется только один корневой узел, для которого нет предшественников – родителей. Адрес корня – 1. Любой другой узел имеет только одного предшественника и одного или двух преемников – потомков. Иногда деревья изображают в виде двумерного массива с явным указанием адресов родителей и потомков для каждого узла k (k=1n). Однако на практике эти адреса лучше не хранить, а вычислять по формулам
родитель: ,
потомок слева: , потомок справа: .
Любой узел дерева может быть корнем другого дерева – поддерева, именуемого номером узла, выбранного в качестве его корня.
Описанное представление массива S в форме бинарного дерева D, используется для построения алгоритма пирамидальной сортировки. Здесь же рассмотрим родственное представление массива S и некоторой дополнительной информации для него в форме дерева. Это позволит уяснить серию бинарных или турнирных сортировок. Пусть элементы массива S размещены в узлах нижнего уровня D. Тогда отсортировать массив можно в два этапа, называемых построением исходного дерева и непосредственной сортировкой.
Этап 1. На первом шаге посредством n/2 сравнений пар элементов массива S определяется элемент с меньшим значением, который переводится на следующий уровень и становится общим родителем пары. На втором шаге за не более, чем n/4+1 сравнений, находятся наименьшие элементы для родительских пар и переводятся на следующий уровень родителей для родительских пар и т.д. В общем случае построение дерева выбора, корнем которого окажется наименьший элемент массива, потребуется всего n-1 сравнений.
Этап 2. Элемент с наименьшим значением , поднявшийся до корня дерева, объявляется очередным элементом отсортированного массива. Производится спуск по пути, им обозначенному при подъеме вверх по дереву. При наличии нескольких таких путей вниз предпочтение отдается тем, которые включают потомков слева. Элемент с наименьшим значением на нижнем уровне D исключается (=) и производится дополнительное сравнение элементов для пройденного пути наверх. При э том в корень дерева выходит следующий элемент с наименьшим значением и т.д. (см. рис.). После n-кратного выполнения этапа дерево D будет состоять из значений , процесс сортировки на этом завершается. Для однократного прохода этапа требуется выполнить log2 n сравнений.
Общая трудоемкость турнирной сортировки составляет O(n log2 n), операций. Алгоритмы этого типа сортировки отличаются способом представления исходной и сопутствующей информации, объемом дополнительной памяти и т.п.
- Введение в программирование и основы алгоритмизации
- 1.2. Понятие "правильной" программы
- 1.3. Надежность программного средства
- 1.4. Технология программирования как разработка надежных пс
- 1.5. Информатизация общества
- Тема 2 источники ошибок в программных средствах
- 2.1. Интеллектуальные возможности человека
- 2.2. Неправильный перевод как причина ошибок в пс
- 2.3. Модель перевода
- На каждом из этих шагов человек может совершить ошибку разной природы.
- 2.4. Основные пути борьбы с ошибками
- Тема 3 общие принципы разработки программных средств
- 3.1. Специфика разработки пс
- 3.2. Жизненный цикл пс
- 3.3. Понятие качества пс
- 3.4. Внешнего описания и его роль в обеспечении качества пс
- 3.5. Обеспечение надежности – основной мотив разработки пс
- 3.5. Борьба со сложностью систем и обеспечение точности перевода
- Тема 4 разработка структуры программы. Модульное и объектно-ориентированное программирование
- 4.1. Цель модульного программирования
- 4.2. Основные характеристики программного модуля
- 4.3. Методы разработки структуры программы
- 4.4. Объектно-ориентированное программирование
- 4.5. События и событийная модель
- Тема 5 Алгоритмизация и разработка программного модуля
- 5.1. Определение алгоритма
- Алгоритмизация - техника составления алгоритмов и программ для решения задач на эвм.
- 5.2. Изобразительные средства описания алгоритмов
- 5.3. Блок-схемы алгоритмов. Графические символы
- 5.4. Порядок разработки программного модуля
- 5.5. Структурное программирование
- 5.6. Пошаговая детализация и понятие о псевдокоде
- Тема 6 тестирование и отладка программного средства
- 6.1. Основные понятия
- 6.2. Принципы и виды отладки пс
- 6.3. Заповеди отладки пс
- 6.4. Автономная отладка пс
- Тема 7 Методы разработки алгоритмов
- 7.1. Метод частных целей
- 7.2. Метод подъема
- 7.3. Программирование с отходом назад
- Тема 8 Алгоритмы сортировки
- 8.1. Сортировка. Основные понятия
- 8.2. Пузырьковая сортировка
- 8.3. Сортировка с помощью дерева
- 8.4. Пирамидальная сортировка
- 8.5. Быстрая сортировка
- Тема 9 Алгоритмы поиска и перебора
- 9.1. Поиск. Основные понятия
- 9.2. Бинарный поиск
- 9.3. Поиск в сети
- Тема 10 Событийно-управляемое программирование на языке Visual Basic
- 10.1. Историческая справка
- 10.2. Основы Visual Basic
- Среда Windows: окна, события, сообщения
- Интерактивная разработка
- Интегрированная среда разработки
- 10.3. Формы и элементы управления
- Разработка и установка свойств формы
- События и методы формы
- Кнопки управления как основа выполнения действий
- 10.4. Элементы управления пользователя
- Флажки и переключатели
- Другие стандартные элементы управления
- 10.5. Фокус. Последовательность переходов. Меню Фокус
- Основы меню
- Контекстные меню
- Редактор меню
- Подсказки пользователю с помощью диалога
- Тема 11 Управление проектами
- 11.1. Работа с проектом и его структура
- 11.2. Работа с несколькими проектами
- 11.4. Установка параметров проекта
- 11.5. Дополнения и мастера
- Тема 12 Управляющие конструкции
- 12.1. Конструкции принятия решения (ветвление)
- 12.2. Циклы
- 12.3. Работа со структурами управления и досрочный выход из них
- Тема 13 Структура приложения. Техника написания кода
- 13.1. Структура приложения
- 13.2. Как работает событийное приложение
- 13.3. До начала кодирования
- 13.4. Техника написания кода
- 13.5. Автоматизация написания программы