Lab6 Q2.cpp
Lab6 Q2.cpp
#include <vector>
#include <algorithm>
#include <cmath>
public:
void insert(Key key) {
pq.push_back(key);
swim(pq.size() - 1);
}
Key delMax() {
std::swap(pq[0], pq.back());
Key max = pq.back();
pq.pop_back();
sink(0);
return max;
}
Key max() const {
return pq[0];
}
bool empty() const {
return pq.empty();
}
int size() const {
return pq.size();
}
};
void swim(int k) {
while (k > 0 && pq[(k-1)/2] > pq[k]) {
std::swap(pq[k], pq[(k-1)/2]);
k = (k-1)/2;
}
}
void sink(int k) {
int n = pq.size();
while (2*k + 1 < n) {
int j = 2*k + 1;
if (j+1 < n && pq[j] > pq[j+1]) j++;
if (!(pq[k] > pq[j])) break;
std::swap(pq[k], pq[j]);
k = j;
}
}
public:
void insert(Key key) {
pq.push_back(key);
swim(pq.size() - 1);
}
Key delMin() {
std::swap(pq[0], pq.back());
Key min = pq.back();
pq.pop_back();
sink(0);
return min;
}
Key min() const {
return pq[0];
}
bool empty() const {
return pq.empty();
}
int size() const {
return pq.size();
}
};
class DynamicMedian {
private:
MaxPQ<int> maxHeap;
MinPQ<int> minHeap;
int median;
public:
DynamicMedian() : median(0) {}
void insert(int num) {
if (maxHeap.empty()) {
maxHeap.insert(num);
median = num;
return;
}
if (num <= median) {
maxHeap.insert(num);
} else {
minHeap.insert(num);
}
if (maxHeap.size() > minHeap.size() + 1) {
minHeap.insert(median);
median = maxHeap.delMax();
} else if (minHeap.size() > maxHeap.size()) {
maxHeap.insert(median);
median = minHeap.delMin();
}
}
int findMedian() const {
return median;
}
void removeMedian() {
if (maxHeap.size() > minHeap.size()) {
median = maxHeap.delMax();
} else {
median = minHeap.delMin();
}
}
};
int main() {
DynamicMedian dm;
dm.insert(10);
std::cout << "Median: " << dm.findMedian() << std::endl;
dm.insert(20);
std::cout << "Median: " << dm.findMedian() << std::endl;
dm.insert(5);
std::cout << "Median: " << dm.findMedian() << std::endl;
dm.insert(15);
std::cout << "Median: " << dm.findMedian() << std::endl;
dm.removeMedian();
std::cout << "Median after removal: " << dm.findMedian() << std::endl;
}