【排序】堆、堆排序及Top K问题

堆(Heap)是一种特殊的二叉树,有以下两个特点:
1.堆是一个完全二叉树;
2.堆中每个节点的值都必须大于等于其子树中每个节点的值(大顶堆)或小于等于其子树中每个节点的值。(小顶堆)。

1、堆的实现

1.1、堆的储存方式

对于完全二叉树而言,采用数组进行储存是一个非常不错的选择,例如上图中的两个堆采用数组进行储存则结构为:

此处有点特殊的是,数组下标为0的位置闲置没有储存数据。在这种情况下,对于下标为i的元素,其左右子树的下标分别为2i和2i+1,父节点则为i/2。

1.2、堆的核心操作

插入元素

插入元素的过程可以分为两步:将插入元素放入数组末尾的空位、堆化使插入新数据后的堆满足开头所谈到的两点要求,核心步骤是对插入后的堆进行堆化。
堆化的过程有两种思路进行实现,自上往下和自下往上,这两种思路的核心都是沿着节点所在的路径进行比较并操作,以下以大顶堆为例,给出插入操作的代码:

public class MyHeap {
   
    private int[] arr;//用于储存元素的数组
    private int n;//堆最多可以储存的元素个数
    private int count;//堆中已经储存的元素个数

    public MyHeap(int capaccity) {
   
        this.arr = new int[capaccity + 1];
        this.n = capaccity;
        this.count = 0;
    }

    public boolean insert(int data) {
   
        if (count == n)
            return false;
        arr[++count] = data;
        //将插入到最后的元素找到应该的位置,实现堆化
        //此处从下至上进行堆化
        int i = count;
        while (i / 2 > 0 && arr[i / 2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值