#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
class Heap{
public:
void insert(int val);
int getMin();
int getSize();
void print();
private:
void heapfyUp(int index);
void heapfyDown(int index);
int left(int index);
int right(int index);
int parent(int index);
vector<int> heap;
};
int Heap::getSize()
{
return heap.size();
}
int Heap::left(int parent)
{
int i = (parent >> 1 ) + 1; // parent * 2 + 1
return i < getSize() ? i : -1;
}
int Heap::right(int parent)
{
int i = (parent >> 1 ) + 2; // parent * 2 + 2
return i < getSize() ? i : -1;
}
int Heap::parent(int child)
{
if(child != 0)
{
int i= child >> 1 ;
return i;
}
return -1;
}
void Heap::insert(int val)
{
heap.push_back(val);
heapfyUp(getSize()-1);
}
//Get priority element
int Heap::getMin()
{
int tmp = heap[0];
heap[0]=heap[getSize()-1];
heapfyDown(0);
return tmp;
}
// Min Heap
void Heap::heapfyUp(int index)
{
while(index>0 && parent(index)>=0 &&
heap[index] < heap[parent(index)] )
{
int temp = heap[index];
heap[index] = heap[parent(index)];
heap[parent(index)] = temp;
index = parent(index);
}
}
//Heap down to move the top element to appropriate position.
void Heap::heapfyDown(int index)
{
int child = left(index);
if(child >=0 && right(index)> 0 &&
heap[child] > heap[right(index) ] )
{
child = right(index);
}
if(heap[index] > heap[child])
{
int temp = heap[index];
heap[index]=heap[child];
heap[child]=temp;
heapfyDown(child);
}
}
void Heap::print()
{
for(int i=0;i < heap.size();i++)
cout<<heap[i]<<" ";
cout<<endl;
}
int main()
{
// Create the heap
Heap* myheap = new Heap();
myheap->insert(700);
myheap->print();
myheap->insert(500);
myheap->print();
myheap->insert(100);
myheap->print();
myheap->insert(800);
myheap->print();
myheap->insert(200);
myheap->print();
myheap->insert(400);
myheap->print();
myheap->insert(900);
myheap->print();
myheap->insert(1000);
myheap->print();
myheap->insert(300);
myheap->print();
myheap->insert(600);
myheap->print();
// Get priority element from the heap
int heapSize = myheap->getSize();
for ( int i = 0; i < heapSize; i++ )
cout << "Get min element = " << myheap->getMin() << endl;
// Cleanup
delete myheap;
}
No comments:
Post a Comment