The Heap data structure is an array that can be viewed as a complete Binary Tree. Each node in the tree corresponds to an element of the array A[ ]. We already discussed Heap data structure in this – post.

However, in this post we will learn about, how to build min/max Heaps using STL. For using vectors as Heap, we need to include the <algorithm> header file.
Max-Heap
vector<int> H = {20, 10, 70, 30};
Create (H)
1. make_heap(H.begin(), H.end());
Insert (H, x)
1. H.push_back(x)
2. push_heap(H.begin(), H.end())
Max (H)
1. return H.front()
Extract-Max (H)
1. x = H.front()
2. pop_heap(H.begin(), H.end())
3. H.pop_back()
3. return x
Time Complexity
- Create (H) procedure: running time O(n)
- Insert (H, x) procedure: running time O(logn)
- Max (H) procedure: running time O(1)
- Extract-Max (H) procedure: running time O(logn)
Code Implementation
//
// main.cpp
// Max Heap
//
// Created by Himanshu on 02/10/21.
//
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main () {
vector<int> maxHeap = {30, 100, 25, 40};
make_heap(maxHeap.begin(), maxHeap.end());
cout<<"Insert H(x) {20, 70}"<<endl;
maxHeap.push_back(20);
push_heap(maxHeap.begin(), maxHeap.end());
maxHeap.push_back(70);
push_heap(maxHeap.begin(), maxHeap.end());
cout<<"Maximum Element (H)"<<endl;
cout<<maxHeap.front()<<endl;
cout<<"Maximum Element (H) after Extract-Max (H)"<<endl;
pop_heap(maxHeap.begin(), maxHeap.end());
maxHeap.pop_back();
cout<<maxHeap.front()<<endl;
cout <<"Extracting out elements..."<<endl;
while (!maxHeap.empty()) {
cout<< maxHeap.front()<<" ";
pop_heap(maxHeap.begin(), maxHeap.end());
maxHeap.pop_back();
}
cout<<endl;
if (maxHeap.empty()) {
cout<<"Heap is empty"<<endl;
} else {
cout<<"Heap is not empty"<<endl;
}
return 0;
}
Output
Insert H(x) {20, 70}
Maximum Element(H)
100
Maximum Element(H) after Extract-Max(H)
70
Extracting out elements...
70 40 30 25 20
Heap is empty
Here’s a working example: Ideone
Min-Heap
For using min-heap, we need to add an extra parameter ie. greater<int>() in heap methods.
vector<int> H = {20, 10, 70, 30};
Create (H)
1. make_heap(H.begin(), H.end(), greater<int>());
Insert (H, x)
1. H.push_back(x)
2. push_heap(H.begin(), H.end(), greater<int>())
Min (H)
1. return H.top()
Extract-Min (H)
1. x = H.top()
2. pop_heap(H.begin(), H.end(), greater<int>())
3. H.pop_back()
3. return x
Time Complexity
- Create (H) procedure: running time O(n)
- Insert (H, x) procedure: running time O(logn)
- Min (H) procedure: running time O(1)
- Extract-Min (H) procedure: running time O(logn)
Code Implementation
//
// main.cpp
// Min Heap
//
// Created by Himanshu on 02/10/21.
//
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main () {
vector<int> minHeap = {30, 100, 25, 40};
make_heap(minHeap.begin(), minHeap.end(), greater<int>());
cout<<"Insert H(x) {20, 70}"<<endl;
minHeap.push_back(20);
push_heap(minHeap.begin(), minHeap.end(), greater<int>());
minHeap.push_back(70);
push_heap(minHeap.begin(), minHeap.end(), greater<int>());
cout<<"Minimum Element (H)"<<endl;
cout<<minHeap.front()<<endl;
cout<<"Minimum Element (H) after Extract-Min (H)"<<endl;
pop_heap(minHeap.begin(), minHeap.end(), greater<int>());
minHeap.pop_back();
cout<<minHeap.front()<<endl;
cout <<"Extracting out elements..."<<endl;
while (!minHeap.empty()) {
cout<< minHeap.front()<<" ";
pop_heap(minHeap.begin(), minHeap.end(), greater<int>());
minHeap.pop_back();
}
cout<<endl;
if (minHeap.empty()) {
cout<<"Heap is empty"<<endl;
} else {
cout<<"Heap is not empty"<<endl;
}
return 0;
}
Output
Insert H(x) {20, 70}
Minimum Element(H)
20
Minimum Element(H) after Extract-Min(H)
25
Extracting out elements...
25 30 40 70 100
Heap is empty
Here’s a working example: Ideone