Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации
Федеральное государственное бюджетное образовательное учреждение Высшего образования «Санкт-Петербургский государственный университет телекоммуникаций им. Проф. М. А. Бонч-Бруевича» (СПбГУТ)
Факультет Информационных технологий и программной инженерии
Кафедра Программной инженерии
Лабораторная работа №1
По дисциплине: Алгоритмы и структуры данных
Тема:
Алгоритмы сортировки
Выполнил студент:
Яковлев М. А. ИКПИ-32
Принял работу:
Дагаев А. В.
Дата выполнения:
«24» февраля 2025 г.
Санкт-Петербург
2025 г.
Постановка задачи
Изучить и практически сравнить эффективность различных алгоритмов сортировки, как простых (например, пузырьковая сортировка), так и более продвинутых (например, быстрая сортировка). Целью является подтверждение теоретических оценок временной сложности алгоритмов и выявление их практических преимуществ.
Описание алгоритма
Метод “пузырька”
Это самый известный и простой способ упорядочения данных. Производятся последовательные просмотры массива и каждый раз пару за парой сравниваются соседние числа. Если числа в паре не расположены в порядке возрастания меняем их местами. Затем переходим к следующей паре. Сортировка считается законченной, если в ходе просмотра не была произведена ни одна перестановка. Можно использовать переменную, например, flag, чтобы зафиксировать факт перестановки, – в начале каждого просмотра переменной присваивается значение 0 (False) и если в ходе просмотра была выполнена хотя бы одна перестановка, значение переменной flag меняется на 1 (True). Таким образом, по значению этой переменной определяем, нужен или нет ещѐ один просмотр.
Быстрая сортировка
Выберем некоторый опорный элемент. После этого перекинем все элементы, меньшие его, налево, а большие – направо. Рекурсивно вызовемся от каждой из частей. В итоге получим отсортированный массив, так как каждый элемент меньше опорного стоял раньше каждого большего опорного.
Подробнее о быстрой сортировке:
1. Выбираем в массиве опорный элемент x (pivot) случайным образом.
2. Разделение массива:
– Просматриваем массив слева направо, пока не найдем элемент ai ≥ x
– Просматриваем массив справа налево, пока не найдем элемент aj ≤ x
– Меняем местами элементы ai и aj
– Повторяем процесс, пока указатели не встретятся
3. В результате разделения получаем:
– Левая часть: все элементы меньше x
– Правая часть: все элементы больше x
4. Рекурсивно применяем алгоритм к обеим частям массива.
Описание программы
Работа была выполнена на языке программирования C++ с использованием среды разработки Visual Studio Community 2022 версии 17.7.4.
Использованные библиотеки: iostream, cstdlib, ctime, chrono, locale
— Функция Swap(int *pa, int *pb) меняет местами значения двух переменных через указатели, используя временную переменную для обмена.
— bubbleSort(int arr[], int n) реализует сортировку пузырьком, проходит по массиву, сравнивая соседние элементы, использует флаг для оптимизации: если на проходе не было обменов, сортировка завершается, каждый проход уменьшает рабочую область массива на 1.
— quickSort(int arr[], int dim) реализует быструю сортировку, выбирает опорный элемент как середину массива, разделяет массив на две части относительно опорного элемента и рекурсивно сортирует полученные части.
— copyArray(int source[], int dest[], int n) копирует элементы из одного массива в другой и используется для создания копий исходного массива перед сортировкой. printArray(int arr[], int n) выводит элементы массива на экран, разделяя их пробелами.
— Функция main() создает массив случайных чисел, тестирует все три алгоритма сортировки, измеряет и выводит время выполнения каждого алгоритма, показывает результаты сортировки.
Тестирование и сравнение
Пузырьком |
|||||
Проход 1 |
2 |
4 |
3 |
5 |
1 |
Проход 2 |
2 |
3 |
4 |
1 |
5 |
Проход 3 |
2 |
3 |
1 |
4 |
5 |
Проход 4 |
2 |
1 |
3 |
4 |
5 |
Проход 5 |
1 |
2 |
3 |
4 |
5 |
|
|
|
|
|
|
Быстрая |
|||||
Проход 1 |
2 |
4 |
3 |
5 |
1 |
Проход 2 |
1 |
4 |
3 |
5 |
2 |
Проход 3 |
1 |
2 |
3 |
5 |
4 |
Проход 4 |
1 |
2 |
3 |
4 |
5 |
Рисунок 1. Демонстрация алгоритмов сортировки
Пузырьковая.
Шаг
Сравнение первых двух элементов со значениями 2 и 4, 4 не меньше 2, поэтому не трогаем;
Шаг
Сдвиг вперед на следующие элементы, а именно второй и третий;
Шаг
Сравнение второго и третьего элемента: 4 и 3;
Шаг
Так как 4 больше 3, то меняем местами 4 и 3;
Шаг
Сдвиг вперед на следующие элементы, а именно третий и четвертый;
Шаг
Сравнение элементов со значениями 4 и 5, не трогаем;
Шаг
Сдвиг вперед на следующие элементы, а именно четвертый и пятый;
Шаг
Сравнение четвертого и пятого элементов со значениями 5 и 1;
Шаг
Так как 5 больше 1, то меняем местами 5 и 1.
Быстрая.
Шаг
Выбор опорного элемента, получается это 3, так как выбираем серединный элемент массива по индексу;
Шаг
Сравнение первого и последнего элементов со значениями 2 и 1;
Шаг
Меняем местами соответствующие элементы;
Шаг
Сравнение второго и предпоследнего элементов со значениями 4 и 5, так как они оба больше опорного элемента, то не трогаем.
