#include #include #include #include "toolbox.hpp" #include "data.hpp" template static bool is_arg_sorted(const asp::Array& a, const asp::Array& indices) noexcept { for (size_t i = 1; i < a.length; ++i) if (a[indices[i - 1]] > a[indices[i]]) return false; return true; } template static bool is_sorted(const asp::Array& a) noexcept { for (size_t i = 1; i < a.length; ++i) if (a[i - 1] > a[i]) return false; return true; } template static void test_sort(const asp::Array& original, void (* const fnc)(const asp::Array&), const char* title) noexcept { #ifdef __DEBUG printf("xxxxxxxxxxxxxxx INGORE COPY "); #endif const asp::Array a(original); asp::measure_time_void(title, fnc, a); #ifdef __DEBUG // assert(asp::measure_time("=> Unit test", is_sorted, a)); const bool result = asp::measure_time("=> Unit test", is_sorted, a); printf("| %-" STR(W_NAME) "s | %" STR(W_TIME) "s | %-" STR(W_FTIME) "s |\n", result ? "Success" : "Failure", "-", "-"); #else assert(is_sorted(a)); #endif } template static void test_argsort(const asp::Array& original, asp::Array(* const fnc)(const asp::Array&), const char* title) noexcept { #ifdef __DEBUG printf("xxxxxxxxxxxxxxx INGORE COPY "); #endif const asp::Array a(original); const asp::Array indices = asp::measure_time>(title, fnc, a); #ifdef __DEBUG // assert(asp::measure_time("=> Unit test", is_arg_sorted, a, indices)); const bool result = asp::measure_time("=> Unit test", is_arg_sorted, original, indices); printf("| %-" STR(W_NAME) "s | %" STR(W_TIME) "s | %-" STR(W_FTIME) "s |\n", result ? "Success" : "Failure", "-", "-"); #else assert(is_arg_sorted(original, indices)); #endif } template static asp::Array create_random_array(const size_t& n) noexcept { asp::Array original(n); std::random_device rd; std::default_random_engine gen(rd()); std::uniform_int_distribution distrib(std::numeric_limits::min(), std::numeric_limits::max()); return std::move(asp::map(original, [& distrib, & gen](const size_t&, const T&) -> const T { return distrib(gen); })); } int main(int argc, char** argv) { asp::toolbox_unit_test(); using array_type = uint16_t; size_t N = static_cast(1)<<16; // size_t N = std::numeric_limits::max(); if (argc > 2) { fprintf(stderr, "Too many arguments\nUsage: ./data \n"); return EXIT_FAILURE; } else if (argc == 2) N = std::strtoul(argv[1], argv + strlen(argv[1]) + 1, 10); asp::print("Estimating memory footprint at : " + asp::format_byte_size(2 * N * sizeof(array_type))); char buff[64]; sprintf(buff, "Sorting algorithm for %s elements", asp::thousand_sep(N).c_str()); asp::print_separator(buff); const asp::Array original = asp::measure_time>("Creating random array", create_random_array, N); // std::cout << asp::min(original) << "<=>" << asp::max(original) << std::endl;; // asp::print(original); test_sort(original, asp::bubble_sort, "Bubble sort"); test_argsort(original, asp::bubble_sort_arg, "Bubble sort (arg)"); test_sort(original, asp::quicksort, "Quicksort"); test_argsort(original, asp::quicksort_arg, "Quicksort (arg)"); test_sort(original, asp::quicksort_iter, "Quicksort (iterative)"); test_argsort(original, asp::quicksort_arg_iter, "Quicksort (iterative) (arg)"); test_sort(original, asp::mergesort, "Mergesort"); test_argsort(original, asp::mergesort_arg, "Mergesort (arg)"); // W.I.P // test_sort(original, asp::counting_sort, "Counting sort"); // test_argsort(original, asp::counting_sort_arg, "Counting sort (arg)"); // test_sort(original, asp::radix_sort, "Radix sort"); // test_argsort(original, asp::radix_sort_arg, "Radix sort (arg)"); return EXIT_SUCCESS; }