70 lines
4.0 KiB
C++
70 lines
4.0 KiB
C++
#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;
|
||
}
|