Advertisement
igoryanchik

heap

Oct 2nd, 2023 (edited)
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.02 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. using namespace std;
  5.  
  6.  
  7. template <class T>
  8. class Heap
  9. {
  10. private:
  11.     T* arr;
  12.     int size;
  13.     int maxSize;
  14.  
  15.     void FilterDown(int cur)
  16.     {
  17.         int curChild = 2 * cur + 1;
  18.  
  19.         while (cur < size)
  20.         {
  21.             curChild = ((curChild + 1 < size) && arr[curChild] < arr[curChild + 1]) ? curChild + 1 : curChild;
  22.             if (arr[curChild] <= arr[cur]) break;
  23.  
  24.             swap(arr[cur], arr[curChild]);
  25.             cur = curChild;
  26.             curChild = 2 * cur + 1;
  27.  
  28.         }
  29.     }
  30.  
  31.     void FilterUp(int cur)
  32.     {
  33.         int parent = (cur - 1) / 2;
  34.  
  35.         while (cur && arr[cur] >= arr[parent])
  36.         {
  37.             swap(arr[cur], arr[parent]);
  38.             cur = parent;
  39.             parent = (cur - 1) / 2;
  40.         }
  41.     }
  42.  
  43.     void HeapBuild()
  44.     {
  45.         int cur = (size - 2) / 2;
  46.  
  47.         while (cur >= 0)
  48.         {
  49.             FilterDown(cur);
  50.             cur--;
  51.         }
  52.  
  53.     }
  54.  
  55. public:
  56.  
  57.     Heap(int _maxSize = 256)
  58.     {
  59.         maxSize = _maxSize;
  60.         size = 0;
  61.         arr = new T[maxSize];
  62.  
  63.         if (arr == 0) throw "MemoryAllocError";
  64.     }
  65.  
  66.     Heap(int _size, int _maxSize = 256)
  67.     {
  68.         size = _size;
  69.         maxSize = _maxSize;
  70.         arr = new T[maxSize];
  71.  
  72.         if (arr == 0) throw "MemoryAllocError";
  73.     }
  74.  
  75.     Heap(T* _arr, int _size, int _maxSize = 256)
  76.     {
  77.         if (_arr == nullptr) throw "Nullptr";
  78.  
  79.         size = _size;
  80.         maxSize = _maxSize;
  81.         arr = new T[maxSize];
  82.  
  83.         if (arr == 0) throw "MemoryAllocError";
  84.  
  85.         for (int i = 0; i < size; ++i)
  86.             Heap<T>::arr[i] = _arr[i];
  87.  
  88.         HeapBuild();
  89.  
  90.  
  91.     }
  92.  
  93.     Heap(const Heap<T>& H)
  94.     {
  95.         if (H.arr == nullptr) throw "Nullptr";
  96.  
  97.         size = H.size;
  98.         maxSize = H.maxSize;
  99.         arr = new T[maxSize];
  100.  
  101.         if(arr == 0) throw "MemoryAllocError";
  102.  
  103.         for (int i = 0; i < size; ++i)
  104.             this->arr[i] = H.arr[i];
  105.  
  106.  
  107.         HeapBuild();
  108.     }
  109.  
  110.  
  111.     void push(const T& key)
  112.     {
  113.  
  114.         if (!size)
  115.         {
  116.             arr = new T[maxSize];
  117.             if (arr == 0) throw "MemoryAllocError";
  118.         }
  119.  
  120.         if (size == maxSize)
  121.         {
  122.             T* arrBuff = arr;
  123.             arr = new T[maxSize * 2];
  124.  
  125.             if (arr == 0) throw "MemoryAllocError";
  126.  
  127.             for (int i = 0; i < size; ++i)
  128.                 arr[i] = arrBuff[i];
  129.  
  130.             delete[] arrBuff;
  131.         }
  132.  
  133.         size++;
  134.         arr[size - 1] = key;
  135.         FilterUp(size - 1);
  136.     }
  137.  
  138.     void pop()
  139.     {
  140.         arr[0] = arr[size - 1];
  141.         size--;
  142.  
  143.         FilterDown(0);
  144.     }
  145.  
  146.     T top() const
  147.     {
  148.         return arr[0];
  149.     }
  150.  
  151.     bool empty() const
  152.     {
  153.         return (size == 0);
  154.     }
  155.  
  156.     void print() const
  157.     {
  158.         for (int i = 0; i < size; ++i)
  159.             cout << arr[i] << " ";
  160.         cout << '\n';
  161.     }
  162.  
  163.  
  164.     ~Heap()
  165.     {
  166.         delete[] arr;
  167.     }
  168. };
  169.  
  170. int main()
  171. {
  172.  
  173.     int arr[4] = { 15, 10, 40, 30 };
  174.  
  175.     Heap<int> H(arr, 4);
  176.     Heap<int> A;
  177.  
  178.     cout << "H is empty?" << (H.empty() ? " YES\n" : " NO\n");
  179.     cout << "A is empty?" << (A.empty() ? " YES\n" : " NO\n");
  180.  
  181.     A.push(5);
  182.     A.push(10);
  183.     A.push(50);
  184.     A.push(11);
  185.     A.push(8);
  186.     A.push(52);
  187.     A.push(55);
  188.     A.push(25);
  189.     A.push(22);
  190.     A.push(20);
  191.  
  192.     H.print();
  193.     A.print();
  194.  
  195.  
  196.     cout << "MAX element: " << A.top() << '\n';  A.pop();
  197.     cout << "MAX element: " << A.top() << '\n';  A.pop();
  198.     cout << "MAX element: " << A.top() << '\n';  A.pop();
  199.     A.print();
  200.  
  201.     Heap<int> B(A);
  202.     cout << "B: "; B.print();
  203.  
  204.     return 0;
  205. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement