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

1.9.1 Временя работы

Как оценить время работы рекурсивного алгоритма? При подсчёте требуется учитывать время, затрачиваемое на рекурсивные вызовы, так что получа­ется некоторое рекуррентное соотношение (recurrence equation). Далее следует оценить время работы, исходя из этого соотношения.

Предположим, что алгоритм разбивает за­дачу размера п на а подзадач, каждая из которых имеет в b раз меньший размер. Будем считать, что разбиение требует времени D(n), а соединение полученных решений – времени С(п). Тогда получаем соотношение для времени работы Т(п) на задачах размера п (в худшем случае):

Т(п) = a·T(/ b) + D(n) + С(п).

Это соотношение выполнено для достаточно больших n, когда задачу имеет смысл разбивать на подзадачи. Для малых n, когда такое разбиение невозможно или не нужно, применяется один из прямых методов решения задачи. Поскольку n огра­ничено, время работы тоже не превосходит некоторой константы.

1.9.2 Анализ времени работы сортировки слиянием через рекуррентное соотношение

Для простоты будем предполагать, что размер списка есть степень двойки. Тогда на каждом шаге сортируемый участок делится на две равные половины. Разбиение на части (вычисление границы) требует времени Θ(1), а слияние – времени Θ(n). В результате получается соотношение:

Это соотношение влечёт T(n) = Θ(nlog n), где через log обозначается двоичный логарифм (основание логарифмов, впрочем, не играет роли, так как приводит лишь к изменению константы). Поэтому для больших n сортировка слиянием эффективнее сортировки вставками, требующей времени (n2).

1.10 Достоинства и недостатки сортировки слиянием

Этот алгоритм работает обычно медленней, чем быстрая сортировка, однако у него есть ряд преимуществ: во-первых, он показывает стабильные результаты при сортировке определённого количества данных, в то время как при быстрой сортировке эти результаты могут довольно сильно различаться. Во-вторых, при большом количестве повторяющихся элементов программа не уходит в глубокую рекурсию. Главный недостаток – использование дополнительной памяти.

Проектный раздел

2.1 Математическая постановка задачи

Для решения данной задачи использована среда программирования Visual Studio С. Программа разработана как приложение с использованием форм, функций сортировки, определения длины списка, разбиения на подсписки и преобразования одного типа переменных в другой. Цикла do-while и условия if. Также были использованы указатели : head-указатель на начало (голову) списка, current – указатель на текущий элемент списка, next – указатель на следующий элемент списка и т. д.. В ходе работы с готовой программой пользователь может выбрать один из двух вариантов действия над списком, в соответствие с чем будут выполнены те или иные действия или функции. Выполнение программы осуществляется с помощью графического интерфейса, в котором используются кнопки, текстовое поле и лейблы, а также такие графические примитивы класса Graphics, как Pen, Brush, Ellipse и т. д.

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