最大堆排序(可用于求最小的K个数)

以下代码均是最大堆

/****************大根堆排序********************/
void AdjustDown(int *a,int s,int n)
{
    a[0]=a[s];//a[0]暂时存放
    for(int i=2*s;i<=n;i*=2)//沿着k较大的字节点向下筛选
    {
        if(i<n && a[i]<a[i+1])
            i++;//取K较大的子节点的下标
        if(a[0]>=a[i]) break;//筛选结束
        else
        {
            a[s]=a[i];//将a[i]调整到双亲节点上
            s=i;//修改k值,以便继续向下筛选
        }
    }
    a[s]=a[0];//被筛选节点的值放在最终位置
}
void BuildMaxHeap(int *a,int n)
{
    for(int i=n/2;i>0;i--)
        AdjustDown(a,i,n);//向下调整
}
void HeapSort(int *a,int n)//n是指待排序列 的元素个数,数组a的长度是n+1,a[0]不使用
{
    BuildMaxHeap(a,n);//创建大根堆,时间复杂度是o(n)
    //调整大根堆,时间复杂度是o(nlgn)
    for(int i=n;i>1;i--)
    {
        swap(a[1],a[i]);
        AdjustDown(a,1,i-1);//向下调整
    }
}

向最大堆插入元素,是指先将新节点放在堆的末尾,在对这个新的节点指向向上调整操作,代码如下

void AdjustUp(int *a,int key)//大根堆插入元素时,需要用到向上调整,key是向上调整的节点,也是堆的元素个数
{
    a[0]=a[key];
    int i=key/2;//若节点值大于双亲节点,则将双亲节点向下调,并继续向上比较
    while(i>0 && a[i]<a[0])
    {
        a[key]=a[i];//双亲节点下调
        key=i;
        i=key/2;//继续向上比较
    }
    a[key]=a[0];//幅值到最终位置
}

利用大根堆求最小的K个数

//求最小的k个数
int a[n];//数组a中存放输入的N个数
int b[k+1];//从a中以此读入k个数a[0]...a[k-1],第一个数存在b[1]中,以此类推
BuildMaxHeap(b,k);//调整b为大根堆
for(int i=k;i<n;i++)
{
    if(a[i]>b[1])
        continue;
    else
    {
        b[1]=a[i];
        AdjustDown(b,1,k);
    }
}

最小堆排序(可用于求最大的K个数)

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值