大根堆和小根堆

大根堆

用数组方法实现:
下沉函数,核心函数,将以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;
}

小根堆

与大根堆原理相同,函数内的大于号改为小于号即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值