#include "myalgorithms.h" #include #include #include // Для секундомера #include // Для копирования массивов // Короткий и длинный 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 vec_short = {5, 7, 1, 2, 15, 29, 100, 1000}; std::vector 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(end - start).count(); } // Функция измерения скорости алгоритма (используется для векторов) double benchmark_vector(void (*func)(std::vector&), std::vector& vec) { std::vector 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(end - start).count(); } // Функция измерения скорости алгоритма (используется для QuickSort) double benchmark_vector(void (*func)(std::vector&, int, int), std::vector& vec) { std::vector 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(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; }