From d319189d7ac995679e04345468b1ff8fe17b4679 Mon Sep 17 00:00:00 2001 From: Ahmet Inan Date: Fri, 8 Mar 2024 09:53:28 +0100 Subject: [PATCH] added merge sort --- sort.hh | 25 +++++++++++++++++++++++++ tests/sort_regression_test.cc | 19 ++++++++++++------- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/sort.hh b/sort.hh index 441773e..10b3aac 100644 --- a/sort.hh +++ b/sort.hh @@ -34,5 +34,30 @@ static void insertion_sort(INDEX *p, TYPE *a, int n) } } +template +class MergeSort +{ + TYPE tmp[MAX_N]; + void merge(TYPE *a, int n, int left, int right, int end) + { + if (right > n) + right = n; + if (end > n) + end = n; + for (int i = left, j = right, k = left; k < end; ++k) + tmp[k] = (i < right && (j >= end || a[i] <= a[j])) ? a[i++] : a[j++]; + } +public: + void operator()(TYPE *a, int n) + { + for (int l = 1; l < n; l *= 2) { + for (int i = 0; i < n; i += 2*l) + merge(a, n, i, i+l, i+2*l); + for (int i = 0; i < n; ++i) + a[i] = tmp[i]; + } + } +}; + } diff --git a/tests/sort_regression_test.cc b/tests/sort_regression_test.cc index 38ea168..b2f3c3d 100644 --- a/tests/sort_regression_test.cc +++ b/tests/sort_regression_test.cc @@ -13,25 +13,30 @@ Copyright 2024 Ahmet Inan int main() { + const int MAX_N = 128; 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]; + auto rand = std::bind(distribution(1, MAX_N), generator(rd())); + int a[MAX_N], b[MAX_N], c[MAX_N], d[MAX_N], e[MAX_N], f[MAX_N], g[MAX_N]; + CODE::MergeSort merge_sort; 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(); + a[i] = b[i] = c[i] = d[i] = e[i] = rand(); std::sort(a, a+size); CODE::insertion_sort(b, size); for (int i = 0; i < size; ++i) assert(a[i] == b[i]); + merge_sort(c, size); 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]; }); - CODE::insertion_sort(f, d, size); + assert(a[i] == c[i]); for (int i = 0; i < size; ++i) - assert(e[i] == f[i]); + f[i] = i; + std::stable_sort(f, f+size, [d](int i, int j){ return d[i] < d[j]; }); + CODE::insertion_sort(g, e, size); + for (int i = 0; i < size; ++i) + assert(f[i] == g[i]); } std::cerr << "Sorting regression test passed!" << std::endl; return 0;