0% found this document useful (0 votes)
22 views3 pages

Lab6 Q2.cpp

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
22 views3 pages

Lab6 Q2.cpp

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 3

#include <iostream>

#include <vector>
#include <algorithm>
#include <cmath>

template <typename Key>


class MaxPQ {
private:
std::vector<Key> pq;
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 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();
}
};

template <typename Key>


class MinPQ {
private:
std::vector<Key> pq;

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;
}

You might also like