diff options
| author | Santo Cariotti <santo@dcariotti.me> | 2023-01-16 20:58:14 +0100 | 
|---|---|---|
| committer | Santo Cariotti <santo@dcariotti.me> | 2023-01-16 20:58:14 +0100 | 
| commit | 31264253a01213fbefd8c5a0a3dc52914107ef5e (patch) | |
| tree | 6e39423aa91768cdee80b67593abf26a2c4632a4 /Year_2/Algorithms/reverse-heapsort.cc | |
| parent | 5d7f508c6241ed8031b220595c9ceb67e32e164d (diff) | |
Add reverse-heapsort
Diffstat (limited to 'Year_2/Algorithms/reverse-heapsort.cc')
| -rw-r--r-- | Year_2/Algorithms/reverse-heapsort.cc | 186 | 
1 files changed, 186 insertions, 0 deletions
| diff --git a/Year_2/Algorithms/reverse-heapsort.cc b/Year_2/Algorithms/reverse-heapsort.cc new file mode 100644 index 0000000..016ce10 --- /dev/null +++ b/Year_2/Algorithms/reverse-heapsort.cc @@ -0,0 +1,186 @@ +#include <fstream> +#include <iostream> +#include <string> + +using namespace std; + +enum class HeapType { +    Min, +    Max +}; + +template <typename H> +class Heap { +public: +    Heap(HeapType type, int n) +        : n_ { n + 1 } +        , type_ { type } +    { +        a_ = new H[n + 1]; +        a_[0] = 0; +    } + +    ~Heap() +    { +        delete[] a_; +    } + +    void +    heapify(int i) +    { +        if (heapsize_ >= 1) +            count_++; + +        int l = left(i); +        int r = right(i); +        int max = i; + +        if (l <= heapsize_ && compare(l, max)) +            max = l; +        if (r <= heapsize_ && compare(r, max)) +            max = r; + +        if (max != i) { +            swap(a_[i], a_[max]); +            heapify(max); +        } +    } + +    void +    build(H aux[], int n) +    { +        a_ = aux; +        heapsize_ = n; + +        for (int i = heapsize_ / 2; i > 0; --i) { +            heapify(i); +        } +    } + +    H +    extract() +    { +        swap(a_[1], a_[heapsize_]); +        heapsize_--; +        heapify(1); + +        return a_[heapsize_ + 1]; +    } + +    inline int +    left(int i) +    { +        return i << 1; +    } +    inline int +    right(int i) +    { +        return (i << 1) | 1; +    } + +    void +    sort(ostream& out) +    { +        H* b = new H[heapsize_ + 1]; + +        int n = heapsize_; + +        for (unsigned i = n; i > 0; --i) { +            b[i] = extract(); +        } +        out << count_ << ' '; +        for (unsigned i = 1; i < n_; ++i) { +            out << b[i] << ' '; +        } +        out << endl; + +        delete[] b; +    } + +private: +    H* a_; +    int heapsize_ { 0 }; +    int n_; +    HeapType type_; + +    bool +    compare(int i, int j) +    { +        return (type_ == HeapType::Max) ? a_[i] > a_[j] : a_[j] > a_[i]; +    } +    int count_ { 0 }; +}; + +int +main(int argc, char** argv) +{ +    int n = (argc > 1) ? stoi(argv[1]) : 100; +    ifstream fin("input.txt"); +    ofstream fout("output.txt"); + +    string t; +    int m; + +    for (int i = 0; i < n; ++i) { +        fin >> t >> m; + +        if (t == "int") { +            Heap<int>* pq = new Heap<int>(HeapType::Min, m); +            int* k = new int[m + 1]; + +            k[0] = 0; +            for (int j = 1; j <= m; ++j) { +                fin >> k[j]; +            } +            pq->build(k, m); + +            pq->sort(fout); + +            delete pq; +        } else if (t == "double") { +            Heap<double>* pq = new Heap<double>(HeapType::Min, m); +            double* k = new double[m + 1]; + +            k[0] = 0; +            for (int j = 1; j <= m; ++j) { +                fin >> k[j]; +            } +            pq->build(k, m); + +            pq->sort(fout); + +            delete pq; +        } else if (t == "bool") { +            Heap<bool>* pq = new Heap<bool>(HeapType::Min, m); +            bool* k = new bool[m + 1]; + +            k[0] = 0; +            for (int j = 1; j <= m; ++j) { +                fin >> k[j]; +            } +            pq->build(k, m); + +            pq->sort(fout); + +            delete pq; +        } else if (t == "char") { +            Heap<char>* pq = new Heap<char>(HeapType::Min, m); +            char* k = new char[m + 1]; + +            k[0] = 0; +            for (int j = 1; j <= m; ++j) { +                fin >> k[j]; +            } +            pq->build(k, m); + +            pq->sort(fout); + +            delete pq; +        } +    } + +    fin.close(); +    fout.close(); + +    return 0; +} | 
