From ad9960635ba4b29a4caa2d14005093594931e3fc Mon Sep 17 00:00:00 2001 From: Daniel Fuchs Date: Thu, 28 Nov 2019 21:42:07 +0100 Subject: [PATCH] Added algorithms library --- README.md | 7 +++++++ src/algorithm/sort/heap.cpp | 3 +++ src/algorithm/sort/heap.h | 8 ++++++++ src/algorithm/sort/merge.cpp | 25 ++++++++++++++++++++++ src/algorithm/sort/merge.h | 25 ++++++++++++++++++++++ src/algorithm/sort/quick.cpp | 40 ++++++++++++++++++++++++++++++++++++ src/algorithm/sort/quick.h | 19 +++++++++++++++++ src/algorithm/sort/radix.cpp | 3 +++ src/algorithm/sort/radix.h | 8 ++++++++ 9 files changed, 138 insertions(+) create mode 100644 src/algorithm/sort/heap.cpp create mode 100644 src/algorithm/sort/heap.h create mode 100644 src/algorithm/sort/merge.cpp create mode 100644 src/algorithm/sort/merge.h create mode 100644 src/algorithm/sort/quick.cpp create mode 100644 src/algorithm/sort/quick.h create mode 100644 src/algorithm/sort/radix.cpp create mode 100644 src/algorithm/sort/radix.h diff --git a/README.md b/README.md index 7877a95..7736189 100644 --- a/README.md +++ b/README.md @@ -21,9 +21,16 @@ - `to_lower` - transform all characters in the string to lowercase - `to_upper` - transform all characters in the string to uppercase +- `c0ding::algorithm` library + - `c0ding::algorithm::sort` algorithms (only partially done) + - `c0ding::algorithm::quick` sort algorithm + ### Currently planned features - `c0ding::networking` library (based on `boost::asio`) - `c0ding::algorithm` library - `c0ding::algorithm::sort` algorithms + - `c0ding::algorithm::heap` sort algorithm + - `c0ding::algorithm::merge` sort algorithm + - `c0ding::algorithm::radix` sort algorithm - `c0ding::algorithm::search` algorithms \ No newline at end of file diff --git a/src/algorithm/sort/heap.cpp b/src/algorithm/sort/heap.cpp new file mode 100644 index 0000000..76763bc --- /dev/null +++ b/src/algorithm/sort/heap.cpp @@ -0,0 +1,3 @@ +#include "./heap.h" + +namespace c0ding::algorithm {} \ No newline at end of file diff --git a/src/algorithm/sort/heap.h b/src/algorithm/sort/heap.h new file mode 100644 index 0000000..cc7ed40 --- /dev/null +++ b/src/algorithm/sort/heap.h @@ -0,0 +1,8 @@ +#ifndef CODING_ALGORITHMS_HEAPSORT_H +#define CODING_ALGORITHMS_HEAPSORT_H + +namespace c0ding::algorithm { + class heap {}; +} + +#endif //CODING_ALGORITHMS_HEAPSORT_H diff --git a/src/algorithm/sort/merge.cpp b/src/algorithm/sort/merge.cpp new file mode 100644 index 0000000..c5832e8 --- /dev/null +++ b/src/algorithm/sort/merge.cpp @@ -0,0 +1,25 @@ +#include "./merge.h" + +namespace c0ding::algorithm { + template + void merge::sort(std::vector& list) { + if (list.size() > 1) { + } + } + + template + void merge::sort_natural(std::vector& list) { + if (list.size() > 1) { + } + } + + template + void merge::_merge(std::vector& left, std::vector& right) { + } + + template + std::vector merge::_bitonic(std::vector& list) { + + return std::vector(); + } +} \ No newline at end of file diff --git a/src/algorithm/sort/merge.h b/src/algorithm/sort/merge.h new file mode 100644 index 0000000..dbe2f37 --- /dev/null +++ b/src/algorithm/sort/merge.h @@ -0,0 +1,25 @@ +#ifndef CODING_ALGORITHMS_MERGESORT_H +#define CODING_ALGORITHMS_MERGESORT_H + +#include +#include + +namespace c0ding::algorithm { + class merge { + public: + template + static void sort(std::vector& list); + + template + static void sort_natural(std::vector& list); + + private: + template + static void _merge(std::vector& left, std::vector& right); + + template + static std::vector _bitonic(std::vector& list); + }; +} + +#endif //CODING_ALGORITHMS_MERGESORT_H diff --git a/src/algorithm/sort/quick.cpp b/src/algorithm/sort/quick.cpp new file mode 100644 index 0000000..7c7e4a8 --- /dev/null +++ b/src/algorithm/sort/quick.cpp @@ -0,0 +1,40 @@ +#include "./quick.h" + +namespace c0ding::algorithm { + template + void quick::sort(std::vector& list) { + if (list.size() > 1) { + _quick(list.begin(), --list.end()); + } + } + + template + void quick::_quick(const typename std::vector::iterator& left, const typename std::vector::iterator& right) { + typename std::vector::iterator i = left, mid = left; + typename std::vector::iterator j = right; + std::advance(mid, std::distance(left, right) / 2); + const long pivot = *mid; + + while (std::distance(i, j) >= 0) { + while (*i < pivot) { + i++; + } + while (*j > pivot) { + j--; + } + if (std::distance(i, j) >= 0) { + std::iter_swap(i, j); + i++; + j--; + } + } + + if (std::distance(left, j) > 0) { + _quick(left, j); + } + + if (std::distance(i, right) > 0) { + _quick(i, right); + } + } +} \ No newline at end of file diff --git a/src/algorithm/sort/quick.h b/src/algorithm/sort/quick.h new file mode 100644 index 0000000..d53e107 --- /dev/null +++ b/src/algorithm/sort/quick.h @@ -0,0 +1,19 @@ +#ifndef CODING_ALGORITHMS_QUICKSORT_H +#define CODING_ALGORITHMS_QUICKSORT_H + +#include +#include + +namespace c0ding::algorithm { + class quick { + public: + template + static void sort(std::vector& list); + + private: + template + static void _quick(const typename std::vector::iterator& left, const typename std::vector::iterator& right); + }; +} + +#endif //CODING_ALGORITHMS_QUICKSORT_H diff --git a/src/algorithm/sort/radix.cpp b/src/algorithm/sort/radix.cpp new file mode 100644 index 0000000..a869a22 --- /dev/null +++ b/src/algorithm/sort/radix.cpp @@ -0,0 +1,3 @@ +#include "./radix.h" + +namespace c0ding::algorithm {} diff --git a/src/algorithm/sort/radix.h b/src/algorithm/sort/radix.h new file mode 100644 index 0000000..05ccb65 --- /dev/null +++ b/src/algorithm/sort/radix.h @@ -0,0 +1,8 @@ +#ifndef CODING_ALGORITHMS_RADIXSORT_H +#define CODING_ALGORITHMS_RADIXSORT_H + +namespace c0ding::algorithm { + class radix {}; +} + +#endif //CODING_ALGORITHMS_RADIXSORT_H