diff options
author | Santo Cariotti <santo@dcariotti.me> | 2023-01-13 18:59:46 +0100 |
---|---|---|
committer | Santo Cariotti <santo@dcariotti.me> | 2023-01-13 18:59:46 +0100 |
commit | de5ca5955666edafb86e2e89f9b0774834939bec (patch) | |
tree | 756ec43bcec53bb0ce895b768a24ff4e3a4da9f7 /Year_2 | |
parent | 9eef7cb7d5a2cd510de0cf17e729dc702fc19128 (diff) |
Add min-enqueue
Diffstat (limited to 'Year_2')
-rw-r--r-- | Year_2/Algorithms/min-enqueue.cc | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/Year_2/Algorithms/min-enqueue.cc b/Year_2/Algorithms/min-enqueue.cc new file mode 100644 index 0000000..d6c9db5 --- /dev/null +++ b/Year_2/Algorithms/min-enqueue.cc @@ -0,0 +1,125 @@ +#include <cmath> +#include <cstdlib> +#include <fstream> +#include <iostream> + +using namespace std; + +template <class H> +class MinHeap { +public: + MinHeap<H>* + enqueue(H key) + { + if (_size == _n) + return this; + ++_size; + _A[_size] = key; + + int i = _size; + int j = i / 2; + + while (i > 1 && _A[i] < _A[j]) { + swap(i, j); + i = j; + j /= 2; + } + + return this; + } + + size_t + left(int i) + { + return i * 2; + } + size_t + right(int i) + { + return i * 2 + 1; + } + + ~MinHeap() + { + delete _A; + } + + MinHeap(H* A, int size, ostream& out) + : _n(size + 1) + { + _A = new H[_n]; + for (int i = 0; i < size; ++i) { + enqueue(A[i]); + } + + for (int i = 1; i <= size; ++i) { + out << _A[i] << ' '; + } + out << endl; + } + + void + swap(int x, int y) + { + auto t = _A[x]; + _A[x] = _A[y]; + _A[y] = t; + } + +private: + H* _A; + size_t _size; + size_t _n; +}; + +int +main(int argc, char** argv) +{ + ifstream fin("input.txt"); + ofstream fout("output.txt"); + string t; + int n, j; + + for (int i = 0; i < atoi(argv[1]); ++i) { + fin >> t; + fin >> n; + + if (t == "bool") { + bool* arr = new bool[n]; + for (j = 0; j < n; ++j) + fin >> arr[j]; + + MinHeap<bool>* mh = new MinHeap<bool>(arr, n, fout); + + delete mh; + } else if (t == "double") { + double* arr = new double[n]; + for (j = 0; j < n; ++j) + fin >> arr[j]; + + MinHeap<double>* mh = new MinHeap<double>(arr, n, fout); + + delete mh; + } else if (t == "char") { + char* arr = new char[n]; + for (j = 0; j < n; ++j) + fin >> arr[j]; + + MinHeap<char>* mh = new MinHeap<char>(arr, n, fout); + + delete mh; + } else if (t == "int") { + int* arr = new int[n]; + for (j = 0; j < n; ++j) + fin >> arr[j]; + + MinHeap<int>* mh = new MinHeap<int>(arr, n, fout); + + delete mh; + } + } + + fin.close(); + fout.close(); + return 0; +} |