Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Отчёт_2

.docx
Скачиваний:
0
Добавлен:
27.06.2025
Размер:
266.74 Кб
Скачать

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

Федеральное государственное автономное образовательное учреждение

высшего образования

«Национальный исследовательский Томский политехнический университет»

Инженерная школа информационных технологий и робототехники

Отделение автоматизации и робототехники

Направление: 15.03.04 – Автоматизация технологических процессов и производств

Отчёт по лабораторной работе № 2

по дисциплине «Основы программирования и алгоритмизации»

«Сравнительный анализ эффективности алгоритмов сортировки

массивов данных»

вариант № 13

Выполнил:

Студент группы 8Т41 Кирильцева К. М.

Проверил:

Ассистент ________________ Кургинов Я. О.

Томск 2024

Цель работы:

Целью данной лабораторной работы является сравнительный анализ эффективности различных алгоритмов сортировки массивов данных. В рамках работы будут рассмотрены такие алгоритмы, как Пузырьковая сортировка, Сортировка выбором, Быстрая сортировка и Сортировка слиянием. Студенты должны будут реализовать эти алгоритмы на выбранном языке программирования и оценить их производительность на разных типах входных данных, включая случайные массивы, уже отсортированные массивы и массивы с повторяющимися элементами.

Задание:

Формулировка

1.

Пузырьковая сортировка (Bubble Sort)

2.

Сортировка выбором (Selection sort)

3.

Сортировка подсчётом (Counting Sort)

Анализ асимптотической сложности и эффективности алгоритмов:

Пузырьковая сортировка (Bubble Sort)

Преимущества:

  1. Алгоритм легко написать и понять.

  2. Сохраняет порядок элементов с одинаковыми ключами.

  3. Не требует доп. памяти.

Недостатки:

  1. В среднем и худшем случаях время работы составляет [O(n2)], что является неэффективным для сортировки больших массивов.

  2. Если массив частично отсортирован, алгоритм может выполнять много лишних операций.

Сортировка выбором (Selection Sort)

Преимущества:

  1. Простота реализации — легко понять и реализовать даже новичкам.

  2. Не требует дополнительной памяти — работает in-place, не нуждается в дополнительных структурах данных.

  3. Предсказуемое поведение — количество сравнений не зависит от изначального порядка элементов.

Недостатки:

  1. Низкая производительность — время выполнения всегда O(n2), независимо от начального порядка.

  2. Непрактична для больших массивов — из-за квадратичной сложности сильно проигрывает другим алгоритмам.

  3. Неустойчива — не сохраняет относительный порядок одинаковых элементов (может быть важно при работе с объектами).

Сортировка подсчётом (Counting Sort)

Преимущества:

  1. Очень быстрая для целых чисел в ограниченном диапазоне — работает за O(n+k), где k — диапазон значений.

  2. Стабильная сортировка — сохраняет порядок элементов с одинаковыми значениями.

  3. Отлично подходит для сортировки по ключу (например, сортировка по возрасту в списке людей).

Недостатки:

  1. Требует дополнительной памяти — создаются вспомогательные массивы для подсчёта.

  2. Не универсальна — работает только с целыми числами (или может быть адаптирована для дискретных значений), неприменима для вещественных чисел или объектов без ключа-счётчика.

  3. Неэффективна при большом диапазоне значений — если максимальное значение велико, память и производительность падают.

Блок схемы:

Блок схема основного кода представлена на рисунке 1.

Рисунок 1- Блок схема основного кода.

Блок схема функции bubble представлена на рисунке 2.

Рисунок 2 - Блок схема функции bubble.

Блок схема функции selectionSort представлена на рисунке 3.

Рисунок 3 - Блок схема функции selectionSort

Блок схема функции countingSort представлена на рисунке 4.

Рисунок 4 - Блок схема функции countingSort

Блок схема функции printArray представлена на рисунке 5.

Рисунок 5 - Блок схема функции printArray.

Результат пузырьковой сортировки показан на рисунке 6:

Рисунок 6 - Результат пузырьковой сортировки

Результат сортировки выбором показан на рисунке 7:

Рисунок 7 - Результат сортировки выбором

Результат сортировки подсчётом показан на рисунке 8:

Рисунок 8 - Результат сортировки подсчётом

Вывод:

Выполнив задание лабораторной работы, научились сортировать массивы, используя различные виды сортировок на языке C++. Ознакомились с принципами работы пузырьковой сортировки, сортировки выбором и сортировки подсчётом, а также провели сравнительный анализ их эффективности и применимости.

Итоговое сравнение:

Пузырьковая сортировка и сортировка выбором — простые в реализации алгоритмы, подходящие для обучения и работы с небольшими массивами. Однако они обладают низкой производительностью и неэффективны для обработки больших объёмов данных. Сортировка подсчётом демонстрирует высокую скорость при сортировке целочисленных массивов с ограниченным диапазоном значений, но требует дополнительной памяти и не применима для всех типов данных.

Приложение A.

(Обязательный)

Листинги программ

Листинг 1 – Код всех функций, использующихся в задании

  1. #include "лаба2 попытка 1.h"

  2. #include <iostream>

  3. #include <cmath>

  4. #include <algorithm>

  5. using namespace std;

  6. // Обмен значений

  7. void customSwap(float& a, float& b) {

  8. float temp = a;

  9. a = b;

  10. b = temp;

  11. }

  12. // Пузырьковая сортировка

  13. void bubbleSort(float arr[], int n) {

  14. for (int i = 0; i < n - 1; i++) {

  15. bool swapped = false;

  16. for (int j = 0; j < n - i - 1; j++) {

  17. if (arr[j] > arr[j + 1]) {

  18. customSwap(arr[j], arr[j + 1]);

  19. swapped = true;

  20. }

  21. }

  22. if (!swapped) break;

  23. }

  24. }

  25. // Сортировка выбором

  26. void selectionSort(float arr[], int n) {

  27. for (int i = 0; i < n - 1; i++) {

  28. int minIndex = i;

  29. for (int j = i + 1; j < n; j++) {

  30. if (arr[j] < arr[minIndex]) {

  31. minIndex = j;

  32. }

  33. }

  34. if (minIndex != i) {

  35. customSwap(arr[i], arr[minIndex]);

  36. }

  37. }

  38. }

  39. // Сортировка подсчётом (округляем float в int)

  40. void countingSort(float arr[], int n) {

  41. if (n == 0) return;

  42. int* intArr = new int[n];

Продолжение Листинга 1

  1. for (int i = 0; i < n; i++) {

  2. intArr[i] = static_cast<int>(round(arr[i]));

  3. }

  4. int minVal = *min_element(intArr, intArr + n);

  5. int maxVal = *max_element(intArr, intArr + n);

  6. int range = maxVal - minVal + 1;

  7. int* count = new int[range]();

  8. int* output = new int[n];

  9. for (int i = 0; i < n; i++)

  10. count[intArr[i] - minVal]++;

  11. for (int i = 1; i < range; i++)

  12. count[i] += count[i - 1];

  13. for (int i = n - 1; i >= 0; i--) {

  14. int index = intArr[i] - minVal;

  15. output[count[index] - 1] = intArr[i];

  16. count[index]--;

  17. }

  18. for (int i = 0; i < n; i++) {

  19. arr[i] = static_cast<float>(output[i]);

  20. }

  21. delete[] intArr;

  22. delete[] count;

  23. delete[] output;

  24. }

  25. // Вывод массива

  26. void printArray(const float arr[], int n) {

  27. for (int i = 0; i < n; i++) {

  28. cout << arr[i] << " ";

  29. }

  30. cout << "\n";

  31. }

Листинг 2 – Код основного файла, для выбора типа сортировки

  1. #include "лаба2 попытка 1.h"

  2. #include <iostream>

  3. #include <fstream>

  4. #include <cstdlib>

  5. #include <ctime>

  6. #include <chrono>

  7. using namespace std;

  8. using namespace chrono;

  9. void createRandomFile(const string& filename) {

  10. ifstream check(filename);

  11. if (check.good()) {

  12. cout << "Файл уже существует. ";

  13. }

  14. ofstream file(filename);

  15. for (int i = 0; i < 10000; ++i)

  16. file << (rand() % 10000) / 10.0f << "\n";

  17. cout << "Файл создан: " << filename << endl;

  18. }

  19. bool loadArrayFromFile(const string& filename, float*& arr, size_t& size) {

  20. ifstream file(filename);

  21. if (!file) {

  22. cerr << "Ошибка: файл не найден!" << endl;

  23. return false;

  24. }

  25. size = 0;

  26. float temp;

  27. while (file >> temp) ++size;

  28. if (size == 0) return false;

  29. file.clear();

  30. file.seekg(0);

  31. arr = new float[size];

  32. for (size_t i = 0; i < size; ++i) file >> arr[i];

  33. return true;

  34. }

  35. void generateRandomArray(float*& arr, size_t& size) {

  36. cout << "Введите размер массива : ";

  37. cin >> size;

  38. if (size <= 0 || size > 10000) {

  39. cerr << "Неверный размер!" << endl;

  40. return;

  41. }

Продолжение Листинга 2

  1. arr = new float[size];

  2. for (size_t i = 0; i < size; ++i)

  3. arr[i] = (rand() % 1000) / 10.0f;

  4. cout << "Сгенерированный массив:\n";

  5. printArray(arr, size);

  6. }

  7. int main() {

  8. setlocale(LC_ALL, "Russian");

  9. srand(static_cast<unsigned>(time(nullptr)));

  10. float* data = nullptr;

  11. size_t size = 0;

  12. int inputChoice, sortChoice;

  13. cout << "1 - Загрузить из файла\n2 - Сгенерировать массив\nВыбор: ";

  14. cin >> inputChoice;

  15. if (inputChoice == 1) {

  16. string filename = "random_numbers.txt";

  17. createRandomFile(filename);

  18. if (!loadArrayFromFile(filename, data, size)) return 1;

  19. cout << "Загруженный массив:\n";

  20. printArray(data, size);

  21. }

  22. else if (inputChoice == 2) {

  23. generateRandomArray(data, size);

  24. }

  25. else {

  26. cerr << "Ошибка: некорректный выбор." << endl;

  27. return 1;

  28. }

  29. cout << "Выберите метод сортировки:\n1 - Пузырьковая\n2 - Выбором\n3 - Подсчётом\nВаш выбор: ";

  30. cin >> sortChoice;

  31. auto start = high_resolution_clock::now();

  32. switch (sortChoice) {

  33. case 1:

  34. bubbleSort(data, size);

  35. break;

  36. case 2:

  37. selectionSort(data, size);

  38. break;

  39. case 3:

  40. countingSort(data, size);

  41. break;

Продолжение Листинга 2

  1. break;

  2. default:

  3. cerr << "Ошибка: некорректный выбор сортировки!" << endl;

  4. delete[] data;

  5. return 1;

  6. }

  7. auto end = high_resolution_clock::now();

  8. auto duration = duration_cast<milliseconds>(end - start);

  9. cout << "Отсортированный массив:\n";

  10. printArray(data, size);

  11. cout << "Сортировка заняла " << duration.count() << " мс\n";

  12. }

Соседние файлы в предмете Основы программирования и алгоритмизации