大根堆
用数组方法实现:
下沉函数,核心函数,将以t为根的且左右子树均为大根堆的树调整为大根堆。
void siftdown(int t,int n)
{
if(t>(n-1)/2)
return ;
int lchild=t*2+1;
int rchild=t*2+2;
int max=t;
if(lchild<n&&x[lchild]>x[max])
{
max=lchild;
}
if(rchild<n&&x[rchild]>x[max])
{
max=rchild;
}
if(max!=t)
{
int temp=x[t];
x[t]=x[max];
x[max]=temp;
siftdown(max,n);
}
}
建堆函数:由于大根堆实际上是满二叉树,所以非叶节点的数目比叶节点少1,故调整时从(n-1)/2开始。
void buildHeap(int n)//对有n个元素的数组建堆
{
int t=(n-1)/2;
int i;
for(i=t;i>=0;i--)
siftdown(i,n);
}
插入函数:向大根堆中插入元素,将其存放到最后一位,然后递归的和其父节点进行比较。
void insert(int num,int n)//将num插入到有n个元素的数组中
{
x[n]=num;
while((n-1)/2>=0&&x[n]>x[(n-1)/2])
{
int temp=x[n];
x[n]=x[(n-1)/2];
x[(n-1)/2]=temp;
n=(n-1)/2;
}
}
移除函数:将大根堆中最大的元素即根元素移除并将其作为返回值返回。
int Removemax(int n)//从有n个元素的数组中移除最大的元素
{
int temp=x[0];
x[0]=x[n-1];
x[n-1]=temp;
siftdown(0,n-1);
return temp;
}
小根堆
与大根堆原理相同,函数内的大于号改为小于号即可。