ivolff

min_bin_Heap

May 20th, 2020
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.53 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <iomanip>
  4. #include <algorithm>
  5.  
  6. template <typename T>
  7. class heap {
  8. private:
  9.     std::vector<T> data;
  10.  
  11.     void siftUP(size_t indx){
  12.         if (indx == 0)
  13.             return;
  14.         size_t par = (indx - 1) / 2;
  15.         if (data[indx] > data[par])
  16.             return;
  17.         std::swap(data[indx], data[par]);
  18.         siftUP(par);
  19.     }
  20.  
  21.     void siftDown(size_t indx) {
  22.         if (data.empty())
  23.             return;
  24.         size_t left = indx * 2 + 1;
  25.         size_t right = indx * 2 + 2;
  26.         if (left >= data.size() && right >= data.size())
  27.             return;
  28.  
  29.         if (left > data.size()) {
  30.             if (data[right] < data[indx])
  31.                 std::swap(data[right], data[indx]);
  32.         }
  33.         if (right > data.size()) {
  34.             if (data[left] < data[indx])
  35.                 std::swap(data[left], data[indx]);
  36.         }
  37.  
  38.         if(data[left] >= data[right] && data[indx] > data[right]) {
  39.             std::swap(data[indx], data[right]);
  40.             siftDown(right);
  41.             return;
  42.         }
  43.  
  44.         if(data[right] > data[left] && data[indx] > data[left]) {
  45.             std::swap(data[indx], data[left]);
  46.             siftDown(left);
  47.             return;
  48.         }
  49.     }
  50.  
  51. public:
  52.     void incert(T& val){
  53.         data.push_back(val);
  54.         siftUP(data.size() - 1);
  55.     }
  56.  
  57.     T Extract(){
  58.         int min_ = data[0];
  59.         data[0] = data[data.size() - 1];
  60.         data.pop_back();
  61.         siftDown(0);
  62.         return min_;
  63.     }
  64. };
Add Comment
Please, Sign In to add comment