Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <iomanip>
- #include <algorithm>
- template <typename T>
- class heap {
- private:
- std::vector<T> data;
- void siftUP(size_t indx){
- if (indx == 0)
- return;
- size_t par = (indx - 1) / 2;
- if (data[indx] > data[par])
- return;
- std::swap(data[indx], data[par]);
- siftUP(par);
- }
- void siftDown(size_t indx) {
- if (data.empty())
- return;
- size_t left = indx * 2 + 1;
- size_t right = indx * 2 + 2;
- if (left >= data.size() && right >= data.size())
- return;
- if (left > data.size()) {
- if (data[right] < data[indx])
- std::swap(data[right], data[indx]);
- }
- if (right > data.size()) {
- if (data[left] < data[indx])
- std::swap(data[left], data[indx]);
- }
- if(data[left] >= data[right] && data[indx] > data[right]) {
- std::swap(data[indx], data[right]);
- siftDown(right);
- return;
- }
- if(data[right] > data[left] && data[indx] > data[left]) {
- std::swap(data[indx], data[left]);
- siftDown(left);
- return;
- }
- }
- public:
- void incert(T& val){
- data.push_back(val);
- siftUP(data.size() - 1);
- }
- T Extract(){
- int min_ = data[0];
- data[0] = data[data.size() - 1];
- data.pop_back();
- siftDown(0);
- return min_;
- }
- };
Add Comment
Please, Sign In to add comment