数据结构与算法(三)——堆及其应用

本文详细介绍了堆数据结构的概念,包括大顶堆和小顶堆,阐述了堆的数组存储方式,并讲解了堆的基本操作:插入和删除。接着,通过实例分析了堆排序的建堆过程和时间复杂度。最后,讨论了堆在优先级队列、Top K问题以及求中位数等实际问题中的应用。堆排序的时间复杂度为O(nlogn),而堆插入和删除的时间复杂度为O(logn)。
摘要由CSDN通过智能技术生成

一、什么是堆?

作为一种数据结构,堆是一个完全二叉树,且堆中每个节点的值必须大于等于(或小于等于)其子节点的值。

  • 对于每个节点的值都大于等于其子节点值的堆,称作“大顶堆”。
  • 对于每个节点的值都小于等于其子节点值的堆,称作“小顶堆”。

下图为大顶堆。

在这里插入图片描述

二、堆的存储方式

堆作为一种完全二叉树,比较适合用数组来存储,这样就不用像二叉树一样,每个节点都要存储左右子节点的指针了。用数组存储只需要通过数组下标,就可以找到当前节点的左右子节点。

在这里插入图片描述

如图,数组下标为i的节点,其左子节点的下标为2 * i,右子节点的下标为2 * i + 1,父节点的坐标为 i / 2

三、堆的基本操作

1、堆的插入

先将需要新节点,以满足完全二叉树特性的方式,插入到堆的最后一层;

对这个堆进行调整,让新插入的节点与父节点进行对比,以大顶堆为例,如果子节点的值大于父节点,则交互两个节点。然后不断地向上调整,最后使得全部节点满足此关系。这个过程通常称为“向上堆化”。

在这里插入图片描述

代码实现:

public class Heap{
   
  private int[] a;//数组,下标从1开始存储
  private int n;//堆中可以存储的最大数据的个数
  private int count;//堆中已存储的数据个数
  
  //构造方法
  public Heap(int capacity){
   
    a = new int[capacity+1];
    n = capacity;
    count = 0;
  }
  
  //堆的插入
  public void insert(int data){
   
    //判断堆中容量是否充足
    if(count >= n){
   
      return;
    }
    //如果容量充足,就将新元素放到已有数据的后面一位
    ++count;
    a[count] = data;
    int i = count;
    //向上堆化
    while(i/2 >= 1
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值