1.把每次插入的元素放入大顶堆;
min.push(num);
2.把大顶堆的最大值(大顶堆.top())放入小顶堆;
max.push(min.top());
min.pop();
3.比较大顶堆与小顶堆的大小,如果大顶堆.size()<小顶堆.size()的话,把小顶堆的最小值(max.top())放入大顶堆中。
if (min.size() < max.size()) {
min.push(max.top());
max.pop();
}
#include <functional>
#include <queue>
class Solution {
public:
priority_queue<int> min;
priority_queue<int, vector<int>, greater<int>> max;
void Insert(int num) {
//1.把每次插入的元素放入大顶堆;
min.push(num);
// 2.把大顶堆的最大值(大顶堆.top())放入小顶堆;
max.push(min.top());
min.pop();
//3.比较大顶堆与小顶堆的大小,如果大顶堆.size()<小顶堆.size()的话,把小顶堆的最小值(max.top())放入大顶堆中。
if (min.size() < max.size()) {
min.push(max.top());
max.pop();
}
}
double GetMedian() {
int n = min.size() + max.size();
if (n%2==0){
return (min.top()+max.top())/2.00;
}else{
return min.top()*1.00;
}
}
};
堆可以看成近似的完全二叉树。堆排序的时间复杂度是O(nlgn)。—输入的其实还是数组,只是一种结构–思想。
大顶堆每一个根结点都比其子节点大–最上面的根结点最大
小顶堆每一个根节点都比子节点小----最上面的根节点最小。
大顶堆(Max Heap):在大顶堆中,每个节点的值都大于或等于其子节点的值。这意味着堆顶元素(根节点)是堆中的最大值。当你插入一个新元素或者从堆中弹出元素时,大顶堆会自动重新调整,将新元素逐步向上移动,以确保堆的性质得以保持。
小顶堆(Min Heap):在小顶堆中,每个节点的值都小于或等于其子节点的值。这意味着堆顶元素(根节点)是堆中的最小值。与大顶堆类似,当插入或弹出元素时,小顶堆会自动进行调整,以保持堆的性质。
这些堆的自动排序功能是由堆的性质决定的。无论你插入新元素还是弹出元素,堆都会根据堆的特性自动重新组织,以确保堆的根节点(堆顶元素)具有所需的特点(最大值或最小值)。
大顶堆和小顶堆常常被用于实现优先队列、寻找中位数、Top K 问题等,利用了它们自动排序的特性来高效地处理数据。在编程中,可以使用标准库中的堆数据结构或者手动实现堆操作来利用这些特性。