2023-12-07 10:16:15 +02:00
|
|
|
#include <BAN/Vector.h>
|
|
|
|
#include <BAN/Sort.h>
|
|
|
|
|
|
|
|
#include <inttypes.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
bool is_sorted(BAN::Vector<T>& vec)
|
|
|
|
{
|
|
|
|
for (size_t i = 0; i < vec.size() - 1; i++)
|
|
|
|
if (vec[i] > vec[i + 1])
|
|
|
|
return false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
#define CURRENT_NS() ({ timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); ts.tv_sec * 1'000'000'000 + ts.tv_nsec; })
|
|
|
|
|
2024-02-01 15:05:17 +02:00
|
|
|
#define TEST_ALGORITHM(ms, function) do { \
|
|
|
|
uint64_t duration_us = 0; \
|
|
|
|
printf(#function "\n"); \
|
|
|
|
for (size_t size = 100; duration_us < ms * 1000; size *= 10) { \
|
|
|
|
BAN::Vector<unsigned> data(size, 0); \
|
|
|
|
for (auto& val : data) \
|
|
|
|
val = rand() % 100; \
|
|
|
|
uint64_t start_ns = CURRENT_NS(); \
|
|
|
|
(void)function(data.begin(), data.end()); \
|
|
|
|
uint64_t stop_ns = CURRENT_NS(); \
|
|
|
|
if (!is_sorted(data)) { \
|
|
|
|
printf(" \e[31mFAILED!\e[m\n"); \
|
|
|
|
break; \
|
|
|
|
} \
|
|
|
|
duration_us = (stop_ns - start_ns) / 1'000; \
|
|
|
|
printf(" %5d.%03d ms (%zu)\n", \
|
|
|
|
(int)(duration_us / 1000), \
|
|
|
|
(int)(duration_us % 1000), \
|
|
|
|
size \
|
|
|
|
); \
|
|
|
|
} \
|
2023-12-07 10:16:15 +02:00
|
|
|
} while (0)
|
|
|
|
|
|
|
|
int main()
|
|
|
|
{
|
|
|
|
srand(time(0));
|
2024-02-01 15:05:17 +02:00
|
|
|
TEST_ALGORITHM(100, BAN::sort::exchange_sort);
|
|
|
|
TEST_ALGORITHM(100, BAN::sort::quick_sort);
|
|
|
|
TEST_ALGORITHM(100, BAN::sort::insertion_sort);
|
|
|
|
TEST_ALGORITHM(100, BAN::sort::heap_sort);
|
|
|
|
TEST_ALGORITHM(100, BAN::sort::intro_sort);
|
|
|
|
TEST_ALGORITHM(1000, BAN::sort::sort);
|
|
|
|
TEST_ALGORITHM(1000, BAN::sort::radix_sort);
|
2023-12-07 10:16:15 +02:00
|
|
|
}
|