大顶堆(c++实现)

【大顶堆的性质】

大顶堆是一棵完全二叉树,且树中的每个节点的值都不小于它的孩子节点的值。我们可以用一个heap数组来表示它。

【大顶堆的插入、删除】

  1. 大顶堆的插入:首先初始化插入位置为最后,然后从下往上调整堆(调整插入元素的位置)。在调整过程中,若当前节点的父亲节点小于插入元素,则将其父亲节点的值赋给当前节点,父亲节点作为当前节点,依此继续;否则当前节点即为插入位置。
  2. 大顶堆的删除:删除根,初始化最后一个元素为新根的值,然后从上往下进行调整堆(调整最后一个元素的位置)。在调整的过程中,若最后一个元素小于当前节点的孩子节点的较大值,则将孩子节点的值赋给当前节点,将孩子节点作为当前节点,依此继续;否则当前节点即为最后一个元素的位置。

【代码实现】

// maxheap_h代码
#ifndef maxheap_h
#define maxheap_h
template<class T>
class Maxheap
{
public:
    Maxheap(int size);
    ~Maxheap();
    bool Isempty();
    void push(T item);  //插入操作
    void pop();  //删除操作
    T top();
private:
    T *heap;
    int currentSize;
    int capacity;
};
//-------构造函数初始化-------
template<class T>
Maxheap<T>::Maxheap(int size)
{
  if(size<1)
  {
    throw"capacity must be >=1";
  }
  else
  {
    currentSize=0;
    capacity=size;
    heap=new T[capacity+1]; //heap[0]不使用
  }
}
//-------析构函数释放空间-------
template<class T>
Maxheap<T>::~Maxheap()
{
 delete []heap;
}
//--------判断堆是否为空-------
template<class T>
bool Maxheap<T>::Isempty()
{
 return currentSize==0;
}
//---------获取最大元素----------
template<class T>
T Maxheap<T>::top()
{
  return heap[1];
}
//-------插入操作-----
template<class T>
void Maxheap<T>::push(T item)
{
   if(currentSize==capacity)
     throw"Maxheap is full";
   else
   {
     currentSize++;
     int currentNode=currentSize;// 元素的插入位置初始化为最后
     while(currentNode>1&&heap[currentNode/2]<item)  //(从下往上)进行调整
     {
       heap[currentNode]=heap[currentNode/2];
       currentNode=currentNode/2;
     }
     heap[currentNode]=item; //插入元素
   }
}

//-----删除操作-------
template<class T>
void Maxheap<T>::pop()
{
  if(Isempty())
    throw"heap is empty ,cannot delete";
  else
  {
   T last=heap[currentSize];  //将最后一个元素初始化为根
   currentSize--;
   int currentNode=1;
   int child=2;
   while(child<=currentSize)  //(从上往下)进行调整
   {
     if(child<currentSize&&heap[child]<heap[child+1])
        child++;
     if(last>=heap[child])
         break;
     else
     {
      heap[currentNode]=heap[child];
      currentNode=child;
      child=child*2;
     }
   }
   heap[ currentNode]=last;
  }
}
#endif
//main.cpp
#include"maxheap.h"
#include<iostream>
using namespace std;
int main()
{
  Maxheap<int> H(100); //创建容量为100的堆
  H.push(20);
  H.push(30);
  H.push(15);
  H.push(40);
  H.push(90);
  cout<<"堆顶元素为:"<<H.top()<<endl;
  H.pop();
  cout<<"堆顶元素为:"<<H.top()<<endl;
  system("pause");
  return 0;
}

【结果】

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 10:09:07

大顶堆(c++实现)的相关文章

wikioi 1052 大顶堆

题目描述 Description 王钢是一名学习成绩优异的学生,在平时的学习中,他总能利用一切时间认真高效地学习,他不但学习刻苦,而且善于经常总结.完善自己的学习方法,所以他总能在每次考试中得到优异的分数,这一切很大程度上是由于他是一个追求效率的人. 但王钢也是一个喜欢玩的人,平时在学校学习他努力克制自己玩,可在星期天他却会抽一定的时间让自己玩一下,他的爸爸妈妈也比较信任他的学习能力和学习习惯,所以在星期天也不会象其他家长一样对他抓紧,而是允许他在星期天上午可以自由支配时间. 地鼠游戏是一项需要

寻找最小的k个数(大顶堆方法)

题目描述:查找最小的k个元素,输入n个整数,输出其中最小的k个. 一般的排序方法,如快排,时间复杂度为O(n*logn+k); 大顶堆方法,时间复杂度为O(k+(n-k)*logk); 如果建立k个元素的最小堆的话,那么其空间复杂度势为O(N),而建立k个元素的最大堆的空间复杂度为O(k); 当面对海量数据处理的时候,大顶堆的方法是较为靠谱的,并且可以在面试时短时间内完成代码. 1 class Solution { 2 public: 3 void Swap(int &a,int &b)

heap c++ 操作 大顶堆、小顶堆

在C++中,虽然堆不像 vector, set 之类的有已经实现的数据结构,但是在 algorithm.h 中实现了一些相关的模板函数.下面是一些示例应用 http://www.cplusplus.com/reference/algorithm/pop_heap/ #include <iostream> #include <algorithm> // make_heap(), pop_heap(), push_heap() #include <vector> using

大顶堆第二弹----堆排序(递归实现)

1 package tooffer; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 6 public class BigHeap { 7 8 9 10 /* 11 *交换堆中的两个元素 12 */ 13 private void swap(ArrayList<Integer> heapList,int srcIndex,int dstIndex) 14 { 15 int tmp = heapList.get(srcIn

poj 2010 Moo University - Financial Aid 大顶堆维护最小和

题意: 有c有牛,从中选(n-1)/2头,使他们的得分中位数最大且需要的资金援助和不超过f. 分析: 堆的运用大顶堆维护最小和. 代码: //poj 2010 //sep9 #include <iostream> #include <queue> #include <algorithm> using namespace std; const int maxN=100024; int dpl[maxN],dpr[maxN]; priority_queue<int&g

wikioi 2573 大顶堆与小顶堆并用

题目描述 Description 我们使用黑匣子的一个简单模型.它能存放一个整数序列和一个特别的变量i.在初始时刻,黑匣子为空且i等于0.这个黑匣子能执行一系列的命令.有两类命令: ADD(x):把元素x放入黑匣子:GET:把i加1的同时,输出黑匣子内所有整数中第i小的数.牢记第i小的数是当黑匣子中的元素已非降序排序后位于第i位的元素. 下面的表6_4是一个11个命令的例子: 表6_4 编号 命令 i 黑匣子内容 输出 1 ADD(3) 0 3 2 GET 1 3 3 3 ADD(1) 1 1,

堆排序——大根堆(大顶堆)

1.小根堆 若根节点存在左子女则根节点的值小于左子女的值:若根节点存在右子女则根节点的值小于右子女的值. 2.大根堆 若根节点存在左子女则根节点的值大于左子女的值:若根节点存在右子女则根节点的值大于右子女的值. 3.结论 (1)堆是一棵完全二叉树(如果公有h层,那么1~h-1层均满,在h层连续缺失若干个右叶子). (2)小根堆的根节点的值是最小值,大根堆的根节点的值是最大值. (3)堆适合于采用顺序存储. 4.堆的插入算法 将一个数据元素插入到堆中,使之依然成为一个堆. 算法描述:先将结点插入到

剑指offer:数据流中的中位数(小顶堆+大顶堆)

1. 题目描述 /** 如何得到一个数据流中的中位数? 如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值. 如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 我们使用 Insert()方法读取数据流,使用 GetMedian()方法获取当前读取数据的中位数. */ 2. 思路 /** 最大堆和最小堆 * 每次插入小顶堆的是当前大顶堆中最大的数 * 每次插入大顶堆的是当前小顶堆中最小的数 * 这样保证小顶堆中的数永远大于等于大顶堆中的数(值

python 大顶堆 小顶堆

http://www.coder4.com/archives/3844 需1求:给出N长的序列,求出TopK大的元素,使用小顶堆,heapq模块实现. import heapq import random class TopkHeap(object): def __init__(self, k): self.k = k self.data = [] def Push(self, elem): if len(self.data) < self.k: heapq.heappush(self.data