Скачиваний:
0
Добавлен:
02.11.2025
Размер:
84.61 Кб
Скачать

Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации

Федеральное государственное бюджетное образовательное учреждение Высшего образования «Санкт-Петербургский государственный университет телекоммуникаций им. Проф. М. А. Бонч-Бруевича» (СПбГУТ)

Факультет Информационных технологий и программной инженерии

Кафедра Программной инженерии

Лабораторная работа №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. Демонстрация алгоритмов сортировки

Пузырьковая.

  1. Шаг

Сравнение первых двух элементов со значениями 2 и 4, 4 не меньше 2, поэтому не трогаем;

  1. Шаг

Сдвиг вперед на следующие элементы, а именно второй и третий;

  1. Шаг

Сравнение второго и третьего элемента: 4 и 3;

  1. Шаг

Так как 4 больше 3, то меняем местами 4 и 3;

  1. Шаг

Сдвиг вперед на следующие элементы, а именно третий и четвертый;

  1. Шаг

Сравнение элементов со значениями 4 и 5, не трогаем;

  1. Шаг

Сдвиг вперед на следующие элементы, а именно четвертый и пятый;

  1. Шаг

Сравнение четвертого и пятого элементов со значениями 5 и 1;

  1. Шаг

Так как 5 больше 1, то меняем местами 5 и 1.

Быстрая.

  1. Шаг

Выбор опорного элемента, получается это 3, так как выбираем серединный элемент массива по индексу;

  1. Шаг

Сравнение первого и последнего элементов со значениями 2 и 1;

  1. Шаг

Меняем местами соответствующие элементы;

  1. Шаг

Сравнение второго и предпоследнего элементов со значениями 4 и 5, так как они оба больше опорного элемента, то не трогаем.