Графики
Кол-во, N |
Пузырьковая, мс |
Быстрая, мс |
100 |
104 |
21 |
200 |
420 |
43 |
300 |
996 |
69 |
400 |
1770 |
92 |
500 |
2784 |
120 |
600 |
4098 |
146 |
700 |
5410 |
174 |
800 |
7320 |
195 |
900 |
9198 |
229 |
Рисунок 2. Таблица временной сложности
Графики сравнение сложности (рис. 4) и отдельный график для Быстрой сортировки (рис. 5)
Рисунок 3. Графики сложности
Рисунок 4. График сложности Быстрой сортировки
На рисунке оранжевым цветом отмечен алгоритм Пузырьковой сортировки, синим — Быстрая (рис. 4). Согласно информации с графика, алгоритм пузырьковой сортировки медленнее алгоритма быстрой сортировки. Также стоит отметить, что алгоритм пузырьковой сильнее замедляется с увеличением размерности строки. Быстрая сортировка замедляется не так критично (рис. 5). В связи с этим можно сказать, что алгоритм быстрой сортировки в среднестатистической ситуации, когда числовое содержание массива может быть любым, предпочтительнее благодаря своей более низкой сложности.
Вывод
В ходе проведенной лабораторной работы была достигнута цель изучения и практического сравнения эффективности алгоритмов сортировки. Реализация и тестирование различных сортировок позволило подтвердить теоретические оценки их временной сложности.
Приложение
main.cpp:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <chrono>
#include <locale.h>
#include "function.h"
using namespace std;
using namespace std::chrono;
int main() {
setlocale(LC_ALL, "Russian");
srand(time(0));
// Создаем и заполняем исходный массив
int r[N];
int A = 0;
int B = 1000;
for (int i = 0; i < N; i++) {
r[i] = rand() % (B - A + 1) + A;
}
int arr1[N], arr2[N];
cout << "Исходный массив: ";
printArray(r, N);
// Тестируем сортировку пузырьком
copyArray(r, arr1, N);
auto start = high_resolution_clock::now();
bubbleSort(arr1, N);
auto stop = high_resolution_clock::now();
auto duration = duration_cast<microseconds>(stop - start);
cout << "\nВремя сортировки пузырьком: " << duration.count() << " микросекунд" << endl;
cout << "Результат: ";
printArray(arr1, N);
// Тестируем быструю сортировку
copyArray(r, arr2, N);
start = high_resolution_clock::now();
quickSort(arr2, N - 1);
stop = high_resolution_clock::now();
duration = duration_cast<microseconds>(stop - start);
cout << "\nВремя быстрой сортировки: " << duration.count() << " микросекунд" << endl;
cout << "Результат: ";
printArray(arr2, N);
return 0;
}
Function.h:
#ifndef FUNCTION_H
#define FUNCTION_H
const int N = 300; // размер массива
void Swap(int *pa, int *pb);
void bubbleSort(int arr[], int n);
int compareAsc(int a, int b);
int compareDesc(int a, int b);
void quickSort(int arr[], int dim);
void copyArray(int source[], int dest[], int n);
void printArray(int arr[], int n);
#endif
Function.cpp:
#include <iostream>
#include "function.h"
using namespace std;
void Swap(int *pa, int *pb) {
int t = *pa;
*pa = *pb;
*pb = t;
}
void bubbleSort(int arr[], int n) {
int m = n;
bool flag;
do {
flag = false;
m--;
for (int i = 0; i < m; i++) {
if (arr[i] > arr[i + 1]) {
Swap(&arr[i], &arr[i + 1]);
flag = true;
}
}
} while (flag);
}
int compareAsc(int a, int b) {
return (a - b);
}
int compareDesc(int a, int b) {
return (b - a);
}
void quickSort(int arr[], int dim) {
int i = 0, j = dim;
int x = arr[dim >> 1];
do {
while (arr[i] < x) i++;
while (arr[j] > x) j--;
if (i <= j) {
Swap(&arr[i], &arr[j]);
i++;
j--;
}
} while (i <= j);
if (j > 0) quickSort(arr, j);
if (i < dim) quickSort(arr + i, dim - i);
}
void copyArray(int source[], int dest[], int n) {
for (int i = 0; i < n; i++) {
dest[i] = source[i];
}
}
void printArray(int arr[], int n) {
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
}
