堆(heap):计算机科学中一类特殊的数据结构的统称,堆通常是一个可以被看做一棵树的数组对象。
堆的性质:
1、堆中某个节点的值总是不大于或不小于其父节点的值
2、堆总是一棵完全二叉树
根据父节点与子节点的大小关系将堆分为:
最大堆:父节点大于子节点
最小堆:父节点小于子节点
堆的操作:
siftdown(int i): 向下调整使结点i的元素满足堆的性质
siftup(int i): 向上调整使结点i的元素满足堆的性质
build():建立一个空堆
insert():向堆中插入一个新元素
get_top():获取当前堆顶元素的值
delete_top():删除堆顶元素
代码实现:注:此代码为最小堆的操作实现
#include<iostream>
#include<algorithm>
#include<math.h>
#include<memory.h>
using namespace std;
#define Max 100000
int heap[Max];//用数组来存堆
int n;//堆的大小
void swap(int a,int b)
{
int temp=heap[a];
heap[a]=heap[b];
heap[b]=temp;
}
void siftdown(int i)//向下调整使结点i的元素值满足堆的性质
{
int t,flag=0;
while(i*2<=n&&flag==0)
{
if(heap[i]>heap[i*2])
t=i*2;
else
t=i;
if(i*2+1<=n)
{
if(heap[t]>heap[2*i+1])
t=2*i+1;
}
if(t!=i)
{
swap(t,i);
i=t;
}
else
flag=1;
}
}
void siftup(int i)//向上调整使结点i的元素值满足堆的性质
{
int flag=0;//标记是否继续调整
if(i==1)//已经在堆顶
return ;
while(i!=1&&flag==0)//需要继续调整
{
if(heap[i]<heap[i/2])//i结点比其父节点小
swap(i,i/2);//交换两结点
else
flag=1;//否则不必再调整
i=i/2;//更新为其父节点,继续向上调整
}
}
void build()//建立一个堆
{
int i;
for(i=n/2;i>=1;i--)
siftdown(i);
}
int get_top()
{
if(n!=0)//如果堆不为空
return heap[1];
return -1;//若堆为空,返回-1
}
int insert(int num)//向堆中插入一个元素num
{
n++;//堆的大小加1
heap[n]=num;//元素num插在堆的末尾
siftup(n);//从位置n向上调整
return num;//返回插入的元素
}
int delete_top()//删除堆顶元素,返回删除的堆顶元素值
{
int t=heap[1];//记录堆顶元素
heap[1]=heap[n];//将最后一个元素放到堆顶即删除堆顶元素
n--;//堆的大小减1
siftdown(1);//向下调整
return t;//返回删除的元素值
}
int main()
{
return 0;
}