This commit is contained in:
2024-12-14 12:19:04 +03:00
parent 1816c866f9
commit 2068aa91a0
8 changed files with 88 additions and 91 deletions

69
task7.cpp Normal file
View File

@@ -0,0 +1,69 @@
#include "myalgorithms.h"
#include <iostream>
#include <vector>
#include <chrono> // Для секундомера
#include <algorithm> // Для копирования массивов
// Короткий и длинный C-массивы
int arr_short[] = {5, 7, 1, 2, 15, 29, 100, 1000};
int arr_long[] = {165, 2, 23, 7, 9, 124, 4, 5000, 26, 20, 80, 55, 6, 1, 8, 10, 9, 12, 3, 6, 7, 5, 4, 4, 3, 2, 1, 100, 1000, 10000};
// Короткий и длинный векторы
std::vector<int> vec_short = {5, 7, 1, 2, 15, 29, 100, 1000};
std::vector<int> vec_long = {165, 2, 23, 7, 9, 124, 4, 5000, 26, 20, 80, 55, 6, 1, 8, 10, 9, 12, 3, 6, 7, 5, 4, 4, 3, 2, 1, 100, 1000, 10000};
// Функция измерения скорости алгоритма (используется для C-массивов)
double benchmark(void (*func)(int[], int), int arr[], int n)
{
// Поскольку все алгоритмы сортировки перезаписывают исходный массив,
// нам необходимо делать копию исходного массива и работать с ней.
// Обратите внимание, поскольку мы не пользуемся указателями и
// Память для копий массива уже заранее выделена при компиляции,
// нам не нужно очищать за собой память (удалять массивы).
// Обязательно удаляйте массивы, если используете указатели!
int arr_copy[n];
std::copy(arr, arr + n, arr_copy);
auto start = std::chrono::high_resolution_clock::now();
func(arr_copy, n);
auto end = std::chrono::high_resolution_clock::now();
return std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count();
}
// Функция измерения скорости алгоритма (используется для векторов)
double benchmark_vector(void (*func)(std::vector<int>&), std::vector<int>& vec)
{
std::vector<int> vec_copy(vec);
std::copy(vec.begin(), vec.end(), vec_copy.begin());
auto start = std::chrono::high_resolution_clock::now();
func(vec_copy);
auto end = std::chrono::high_resolution_clock::now();
return std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count();
}
// Функция измерения скорости алгоритма (используется для QuickSort)
double benchmark_vector(void (*func)(std::vector<int>&, int, int), std::vector<int>& vec)
{
std::vector<int> vec_copy(vec);
std::copy(vec.begin(), vec.end(), vec_copy.begin());
auto start = std::chrono::high_resolution_clock::now();
func(vec_copy, 0, vec_copy.size() - 1);
auto end = std::chrono::high_resolution_clock::now();
return std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count();
}
int main()
{
std::cout << "Bubble sort: " << benchmark_vector(bubbleSort, vec_short) << ", " << benchmark_vector(bubbleSort, vec_long) << std::endl;
std::cout << "Cocktail sort: " << benchmark(CocktailSort, arr_short, sizeof(arr_short) / sizeof(arr_short[0])) << ", " << benchmark(CocktailSort, arr_long, sizeof(arr_long) / sizeof(arr_long[0])) << std::endl;
std::cout << "Insertion sort: " << benchmark(insertionSort, arr_short, sizeof(arr_short) / sizeof(arr_short[0])) << ", " << benchmark(insertionSort, arr_long, sizeof(arr_long) / sizeof(arr_long[0])) << std::endl;
std::cout << "Selection sort: " << benchmark(selectionSort, arr_short, sizeof(arr_short) / sizeof(arr_short[0])) << ", " << benchmark(selectionSort, arr_long, sizeof(arr_long) / sizeof(arr_long[0])) << std::endl;
std::cout << "Shell sort: " << benchmark(shellSort, arr_short, sizeof(arr_short) / sizeof(arr_short[0])) << ", " << benchmark(shellSort, arr_long, sizeof(arr_long) / sizeof(arr_long[0])) << std::endl;
std::cout << "Quick sort: " << benchmark_vector(quickSort, vec_short) << ", " << benchmark_vector(quickSort, vec_long) << std::endl;
return 0;
}