Advertisement
adnan_dipta89

MinHeap

Oct 16th, 2019
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.56 KB | None | 0 0
  1. #include <cmath>
  2. #include <cstdio>
  3. #include <vector>
  4. #include <iostream>
  5. #include <algorithm>
  6. #include <bits/stdc++.h>
  7. using namespace std;
  8.  
  9. class Heap
  10. {
  11. public:
  12.     vector<int> v;
  13.     int heapsize;
  14.     Heap()
  15.     {
  16.         v.push_back(INT_MAX);
  17.         heapsize = 0;
  18.     }
  19.     int parent(int i)
  20.     {
  21.         return floor(i/2);
  22.     }
  23.     int left(int i)
  24.     {
  25.         return 2*i;
  26.     }
  27.     int right(int i)
  28.     {
  29.         return 2*i+1;
  30.     }
  31.     void buildMinHeap();
  32.     void minHeapify(int i);
  33.     void increaseKey(int i,int value);
  34.     void insertKey(int value);
  35.     int findIndex(int i,int value);
  36.     int extractMin();
  37.     bool isEmpty();
  38.     int _min(){return v[1];}
  39.     void _clear(){v.clear(); v.push_back(INT_MAX);heapsize = 0;}
  40.  
  41. };
  42. void Heap::buildMinHeap()
  43. {
  44.     for(int i = heapsize/2; i >= 1; i--)
  45.     {
  46.         minHeapify(i);
  47.     }
  48. }
  49. void Heap::minHeapify(int i)
  50. {
  51.     int l = left(i);
  52.     int r = right(i);
  53.     int smallest;
  54.     if(l <= heapsize && v[l] < v[i])
  55.     {
  56.         smallest = l;
  57.     }
  58.     else
  59.     {
  60.         smallest = i;
  61.     }
  62.     if(r <= heapsize && v[r] < v[smallest])
  63.     {
  64.         smallest = r;
  65.     }
  66.     if(smallest != i)
  67.     {
  68.         swap(v[smallest],v[i]);
  69.         minHeapify(smallest);
  70.     }
  71. }
  72. void Heap::increaseKey(int i, int value)
  73. {
  74.     v[i] = value;
  75.     while(i > 1 && v[parent(i)] > v[i])
  76.     {
  77.         swap(v[parent(i)],v[i]);
  78.         i = parent(i);
  79.     }
  80. }
  81. void Heap::insertKey(int value)
  82. {
  83.     v.push_back(INT_MAX);
  84.     heapsize++;
  85.     increaseKey(heapsize,value);
  86. }
  87. int Heap::extractMin()
  88. {
  89.     if(heapsize < 1)
  90.         return -1;
  91.     int _min = v[1];
  92.     v[1] = v[heapsize];
  93.     heapsize--;
  94.     minHeapify(1);
  95.     return _min;
  96.  
  97. }
  98. int Heap::findIndex(int i, int value)
  99. {
  100.     int tmpindex;
  101.     // cout << i << " " << heapsize << endl;
  102.     if(v[i] == value)
  103.         return i;
  104.     else if(2*i > heapsize)
  105.         return -1;
  106.     else if((tmpindex = findIndex(2*i,value)) > 0)
  107.     {
  108.         return tmpindex;
  109.     }
  110.     else if(2*i+1 > heapsize)
  111.     {
  112.         return -1;
  113.     }
  114.     else
  115.     {
  116.         return findIndex(2*i+1,value);
  117.     }
  118.     return -1;
  119. }
  120. bool Heap::isEmpty()
  121. {
  122.     if(heapsize == 0)
  123.         return true;
  124.     return false;
  125. }
  126. int main() {
  127.     Heap h;
  128.     h.insertKey(3);
  129. //    cout << h.heapsize << endl;
  130.     h.insertKey(2);
  131.     h.insertKey(1);
  132.     while(!h.isEmpty())
  133.     {
  134.         cout << h.extractMin() << " ";
  135.     }
  136.     cout << endl;
  137.     /* Enter your code here. Read input from STDIN. Print output to STDOUT */
  138.     return 0;
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement