From 524571e6fb6dd2a7b1339fa5a7a519e19d8216f7 Mon Sep 17 00:00:00 2001 From: Ahmet Inan Date: Thu, 7 Mar 2024 19:45:47 +0100 Subject: [PATCH] added insertion sort and regression test --- sort.hh | 34 ++++++++++++++++++++++++++++++ tests/sort_regression_test.cc | 39 +++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 sort.hh create mode 100644 tests/sort_regression_test.cc diff --git a/sort.hh b/sort.hh new file mode 100644 index 0000000..b1ea7f2 --- /dev/null +++ b/sort.hh @@ -0,0 +1,34 @@ +/* +Some stable sorting algorithms + +Copyright 2024 Ahmet Inan +*/ + +#pragma once + +template +static void insertion_sort(TYPE *a, int n) +{ + for (int i = 1, j; i < n; ++i) { + TYPE t = a[i]; + for (j = i; j > 0 && a[j-1] > t; --j) + a[j] = a[j-1]; + a[j] = t; + } +} + +template +static void insertion_sort(int *p, TYPE *a, int n) +{ + p[0] = 0; + for (int i = 1, j; i < n; ++i) { + TYPE t = a[i]; + for (j = i; j > 0 && a[j-1] > t; --j) { + a[j] = a[j-1]; + p[j] = p[j-1]; + } + a[j] = t; + p[j] = i; + } +} + diff --git a/tests/sort_regression_test.cc b/tests/sort_regression_test.cc new file mode 100644 index 0000000..449c859 --- /dev/null +++ b/tests/sort_regression_test.cc @@ -0,0 +1,39 @@ +/* +Regression Test for sorting + +Copyright 2024 Ahmet Inan +*/ + +#include +#include +#include +#include +#include +#include "sort.hh" + +int main() +{ + std::random_device rd; + typedef std::default_random_engine generator; + typedef std::uniform_int_distribution distribution; + auto rand = std::bind(distribution(1, 32), generator(rd())); + int a[32], b[32], c[32], d[32], e[32], f[32]; + for (int loop = 0; loop < 1000000; ++loop) { + int size = rand(); + for (int i = 0; i < size; ++i) + a[i] = b[i] = c[i] = d[i] = rand(); + std::sort(a, a+size); + insertion_sort(b, size); + for (int i = 0; i < size; ++i) + assert(a[i] == b[i]); + for (int i = 0; i < size; ++i) + e[i] = i; + std::stable_sort(e, e+size, [c](int i, int j){ return c[i] < c[j]; }); + insertion_sort(f, d, size); + for (int i = 0; i < size; ++i) + assert(e[i] == f[i]); + } + std::cerr << "Sorting regression test passed!" << std::endl; + return 0; +} +