
- •Введение
- •Теоретический раздел
- •Определение списка
- •1.2 Свойства списка
- •1.3 Виды списков
- •1.3.1 Линейный односвязный список
- •1.3.2 Кольцевой односвязный список
- •1.3.3 Линейный двусвязный список
- •1.3.4 Кольцевой двусвязный список
- •1.3.5 Многосвязные списки
- •1.4 Описание компилятора Microsoft Visual Studio
- •1.5 Visual Studio 2010
- •1.6 Приложения Windows Forms
- •1.6.1 Графические элементы Windows Forms
- •Рисунки;
- •Типографская разметка.
- •1.6.1.1 Двухмерная векторная графика
- •1.6.1.2 Рисунки
- •1.6.1.3 Типографская разметка
- •1.6.2 Классы Windows Forms
- •1.7 Определение сортировки слиянием
- •1.8 Пример сортировки слиянием
- •1.9.1 Временя работы
- •1.9.2 Анализ времени работы сортировки слиянием через рекуррентное соотношение
- •1.10 Достоинства и недостатки сортировки слиянием
- •Проектный раздел
- •2.1 Математическая постановка задачи
- •2.2 Описание входных и выходных данных
- •Программный раздел
- •3.1 Описание структуры программы и её основных частей
- •3.2 Описание функций составных частей и связей между ними
- •Экспериментальный раздел Тестирование
- •Заключение
- •Список использованных источников
1.9.1 Временя работы
Как оценить время работы рекурсивного алгоритма? При подсчёте требуется учитывать время, затрачиваемое на рекурсивные вызовы, так что получается некоторое рекуррентное соотношение (recurrence equation). Далее следует оценить время работы, исходя из этого соотношения.
Предположим, что алгоритм разбивает задачу размера п на а подзадач, каждая из которых имеет в b раз меньший размер. Будем считать, что разбиение требует времени D(n), а соединение полученных решений – времени С(п). Тогда получаем соотношение для времени работы Т(п) на задачах размера п (в худшем случае):
Т(п) = a·T(n / b) + D(n) + С(п).
Это соотношение выполнено для достаточно больших n, когда задачу имеет смысл разбивать на подзадачи. Для малых n, когда такое разбиение невозможно или не нужно, применяется один из прямых методов решения задачи. Поскольку n ограничено, время работы тоже не превосходит некоторой константы.
1.9.2 Анализ времени работы сортировки слиянием через рекуррентное соотношение
Для простоты будем предполагать, что размер списка есть степень двойки. Тогда на каждом шаге сортируемый участок делится на две равные половины. Разбиение на части (вычисление границы) требует времени Θ(1), а слияние – времени Θ(n). В результате получается соотношение:
Это соотношение влечёт T(n) = Θ(nlog n), где через log обозначается двоичный логарифм (основание логарифмов, впрочем, не играет роли, так как приводит лишь к изменению константы). Поэтому для больших n сортировка слиянием эффективнее сортировки вставками, требующей времени (n2).
1.10 Достоинства и недостатки сортировки слиянием
Этот алгоритм работает обычно медленней, чем быстрая сортировка, однако у него есть ряд преимуществ: во-первых, он показывает стабильные результаты при сортировке определённого количества данных, в то время как при быстрой сортировке эти результаты могут довольно сильно различаться. Во-вторых, при большом количестве повторяющихся элементов программа не уходит в глубокую рекурсию. Главный недостаток – использование дополнительной памяти.
Проектный раздел
2.1 Математическая постановка задачи
Для решения данной задачи использована среда программирования Visual Studio С. Программа разработана как приложение с использованием форм, функций сортировки, определения длины списка, разбиения на подсписки и преобразования одного типа переменных в другой. Цикла do-while и условия if. Также были использованы указатели : head-указатель на начало (голову) списка, current – указатель на текущий элемент списка, next – указатель на следующий элемент списка и т. д.. В ходе работы с готовой программой пользователь может выбрать один из двух вариантов действия над списком, в соответствие с чем будут выполнены те или иные действия или функции. Выполнение программы осуществляется с помощью графического интерфейса, в котором используются кнопки, текстовое поле и лейблы, а также такие графические примитивы класса Graphics, как Pen, Brush, Ellipse и т. д.
Основной алгоритм заключается в том, что во время выполнения программы на вход поступает некоторое целое неотрицательное число, его добавление в список осуществляется по нажатию пользователем кнопки, которая будет вызывать функцию выделения памяти для элемента и добавления его в список. Также для удобства работы должна быть предоставлена возможность просмотра списка, то есть графическое изображение списка должно быть отображено на экране. После добавления элемента в список должна начаться работа функции paintSp, которая создает графические примитивы с учетом введенных данных и выводит их на экран. В функции указываются размеры, цвета и шрифт. По окончанию ввода всех элементов должна быть возможна их сортировка слиянием. Это может осуществляется рядом функций, также вызванных нажатием кнопки. В ходе выполнения функций должна произойти проверка: отличен ли размер списка от нуля или единицы, так как в этом случае сортировка не имеет смысла. здесь также должна быть использована функции paintSp для отображения результата.