
- •Лабораторная работа № 1 структура данных дерево
- •Теоретические сведения
- •Синтаксис объявления класса tTreeNode
- •Синтаксис объявления класса tTree
- •Программа работы
- •Контрольные вопросы
- •Лабораторная работа № 2 бинарные деревья
- •Теоретические сведения
- •Синтаксис объявления класса tBinTreeNode
- •Синтаксис объявления класса tBinTree
- •Программа работы
- •Контрольные вопросы
- •Лабораторная работа № 3 бинарные деревья поиска
- •Теоретические сведения
- •Синтаксис объявления класса tFindTreeNode
- •Синтаксис объявления класса tFindTree
- •Программа работы
- •Контрольные вопросы
- •Лабораторная работа № 4 сбалансированные деревья. Пирамида.
- •Теоретические сведения
- •Синтаксис объявления класса tHeap
- •Пирамидальная сортировка
- •Программа работы
- •Контрольные вопросы
- •Лабораторная работа № 5 алгоритмы сортировки данных
- •Теоретические сведения
- •Алгоритмы внутренней сортировки
- •Программа работы
- •Контрольные вопросы
- •Лабораторная работа № 6 структура данных граф
- •Теоретические сведения
- •Программа работы
- •Контрольные вопросы
- •Библиографический список
- •Содержание
Пирамидальная сортировка
Для сортировки массивов данных содержащих n элементов можно использовать класс пирамиды. Для этого необходимо, в начале, массив данных преобразовать в пирамиду, а затем удалить последовательно все элементы из пирамиды. Т.к. при очередном удалении в вершине пирамиды будет находиться минимальный элемент, то полученный массив будет отсортирован по возрастанию.
Для преобразования случайного массива данных в пирамиду можно воспользоваться для всех не листовых элементов методом MoveDown.
Пусть в массиве n
элементов, тогда индекс последнего
элемента будет
,
а индекс его родителя
.
Для всех узлов от 0 до
необходимо вызвать метод MoveDown.
Реализовать данный алгоритм можно с
помощью перегруженного конструктора
класса THeap.
template <class T>
THeap<T>::THeap(vector<T> A)
{
Items=A;
FSize=A.size();
for (int i = (FSize-2)/2; i >= 0; i--)
MoveDown(i);
}
Алгоритм пирамидальной сортировки можно реализовать с помощью следующей функции:
template <class T>
void HeapSort(T *A, const int n)
{
vector<T> Vector;
for (int i = 0; i < n; i++)
Vector.push_back(A[i]);
THeap<T> Heap(Vector);
for (int i = 0; i < n; i++)
A[i]=Heap.Delete();
}
Анализ вычислительной
сложности данного алгоритма показывает,
что для преобразования массива в пирамиду
потребуется
вызова метода MoveDown, внутри каждого
из которых потребуется в наихудшем
случае
перестановок. При удалении элементов
из пирамиды потребуется (n-1) вызовов
метода MoveDown c
перестановками в наихудшем случае.
Общие затраты:
Данный анализ
показывает, что затраты пропорциональны
,
что меньше, чем у большинства других
методов сортировки.
Дерево, как стек или очередь, является одной из широко используемых структур данных во всех языках программирования. С ее помощью организуется файловая структура в любой операционной системе. Она применяется для хранения и представления больших объемов информации в иерархическом виде, а пирамидальная сортировка, основанная на деревьях, является одним из самых быстродействующих и устойчивых алгоритмов сортировки данных.
Программа работы
Создать новый проект в меню FileðNewðVCL Forms Application, добавить к нему новый модуль (FileðNewðUnit) и сохранить все файлы в папке с именем ‘…\Лабораторная работа № 4’.
В заголовочной части второго модуля объявить класс THeap и все его методы в соответствии с ADT – форматом.
Создать на форме компоненты Edit1 ¸ EditN и кнопку Button1. В компонентах Edit1 ¸ EditN-1 представить буквы Вашей фамилии в виде бинарного дерева.
Рис. 8. Примерное расположение компонентов на форме
В обработчике нажатия кнопки Button1 сформировать массив из букв вашей фамилии, хранящихся в компонентах Edit1 ¸ EditN-1 с типом сhar, создать объект пирамиды и отсортировать все элементы массива, используя метод пирамедальной сортировки. Вывести результат сортировки массива в компонент EditN.
Запустить программу на выполнение и записать в отчет класс THeap и все его методы, расположение компонентов на форме, обработчик нажатия кнопки Button1 и полученные результаты работы программы.
Ответить на контрольный вопрос, записав в отчет разработанный метод, обработчик его использования и результат выполнения программы.