堆(heap)

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值