ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»
(СПбГУТ)
Дисциплина: «Алгоритмы и структуры данных»
Лабораторная работа №1.
Выполнил: Студент группы ИКПИ-41
Летягина Е. А.
Проверил: Кандидат технических наук, доцент кафедры ПИиВТ
Дагаев А. В.
г. Санкт-Петербург
Описание алгоритмов
Для сравнения были выбраны два алгоритма сортировки: сортировка вставками и сортировка слиянием.
Сортировка вставками:
Суть этого метода сортировки заключается в последовательной вставке каждого элемента несортированного списка на его правильное место в отсортированной части списка.
Временная сложность:
В лучшем случае O(n), если список уже отсортирован;
В среднем случае O(n2), если список упорядочен случайным образом;
В худшем случае O(n2), если список упорядочен в обратном порядке.
Сортировка слиянием:
Алгоритм работает по принципу рекурсивного разделения входного массива на две половины, рекурсивной сортировки этих двух половин и последующего их объединения для получения отсортированного массива.
Временная сложность:
В лучшем случае O(n log n), когда массив уже отсортирован или почти отсортирован;
В среднем случае O(n log n), когда массив упорядочен случайным образом;
В худшем случае O(n log n), когда массив отсортирован в обратном порядке.
Описание программы
Программа предназначена для сравнения времени выполнения двух алгоритмов сортировки: сортировки вставками и сортировки слиянием. Измерение производится многократным запуском алгоритмов с последующим усреднением времени для повышения точности.
В программе используются константные значения N для размера массива и NN для количества повторений каждого алгоритма для усреднения.
Функции программы:
int rrand(int range_min, int range_max) - Генерирует случайное целое число в заданном диапазоне с помощью rand().
void sort_inserts(int x[], int n) - Реализует сортировку вставками. Двойным циклом проходится по массиву, перемещая текущий элемент влево, пока он меньше предыдущего (используется swap).
void mergeSort(int list[], int start, int end) - Рекурсивно делит массив на две половины и вызывает слияние.
void merge(int list[], int start, int end, int mid) - Сливает две отсортированные половины массива с использованием временного массива mergedList[N]. Элементы сравниваются и помещаются во временный массив, затем копируются обратно.
void print_array(int arr[], int size) - Выводит первые size элементов массива на экран.
Основные шаги в функции main():
Инициализация генератора случайных чисел srand().
Заполнение исходного массива orig случайными числами от -2000 до 2000.
Вывод первых 20 элементов исходного массива.
Измерение времени чистого копирования (без сортировки) для последующего вычитания накладных расходов. Выполняется NN раз.
Измерение времени сортировки вставками: цикл из NN итераций, каждая включает копирование исходного массива в рабочий и вызов sort_inserts. Вычитается время копирования, затем результат делится на NN – получается среднее время одной сортировки.
Вывод 20 первых элементов отсортированного массива.
Аналогично для сортировки слиянием с вызовом mergeSort(work, 0, N-1).
Результаты выводятся на экран в миллисекундах с шестью знаками после запятой.
Программа для исследования алгоритмов сортировки написана на языке C++ с использованием стандартной библиотеки, что обеспечивает эффективность и кроссплатформенность. В качестве среды разработки использовалась Visual Studio Code, предлагающая удобные инструменты для написания кода и отладки. Программа не использует сторонних библиотек, что делает её легковесной и простой для запуска на различных платформах.
