数据结构——堆(介绍,堆的基本操作、堆排序)

news/2025/1/21 18:26:46/
我是一个计算机专业研0的学生卡蒙Camel🐫🐫🐫(刚保研)
记录每天学习过程(主要学习Java、python、人工智能),总结知识点(内容来自:自我总结+网上借鉴)
希望大家能一起发现问题和补充,也欢迎讨论👏👏👏

目录

    • 堆的介绍
    • 堆存储
    • 堆操作
      • 堆插入
      • 删除堆顶
        • 自底向上堆化
        • 自顶向下堆化
    • 堆排序
      • 1. 建堆
      • 2. 排序

堆的介绍

堆是一种特殊的树形数据结构,通常以完全二叉树的形式表示,并且满足堆属性。根据堆属性的不同,堆可以分为两种类型:

  • 最大堆(Max Heap):对于每个节点,它的值都大于或等于其子节点的值。因此,堆顶元素(根节点)总是最大的。
  • 最小堆(Min Heap):对于每个节点,它的值都小于或等于其子节点的值。因此,堆顶元素(根节点)总是最小的。

img

堆存储

img

  • (二叉)堆可以用完全二叉树的形式进行存储。
  • 树中任意节点 i,其左子节点序号为 2*i,右子节点序号为 2*i+1

堆操作

堆插入

  1. 将要插入的元素放到最后
  2. 从底向上,如果父结点比该元素小,则该节点和父结点交换,直到无法交换

img

删除堆顶

删除对顶元素是最大堆(最小堆)的最大值(最小值),为了保持堆的性质,需要对堆的结构进行调整,我们将这个过程称之为"堆化",有两种方法:

  1. 自底向上的堆化
  2. 自顶向下堆化
自底向上堆化

大顶堆为例:

  1. 先删除堆顶元素(即数组中index = 1的位置)
  2. 比较根结点的左子节点和右子节点(index = 2和3),较大的元素放到根节点
  3. 此时又有空位,和步骤2一样,空位两个子节点较大的移动到空位,直到最底部

img

自顶向下堆化
  1. 我们将最后一个元素移动到堆顶。
  2. 不停与左右子节点的值进行比较,和较大的子节点交换位置,直到无法交换位置。

img

堆排序

堆排序分为两个步骤:

  1. 建堆
  2. 排序

1. 建堆

建堆需要对所有非叶节点的自顶向下堆化。

顺序是从index=n/2index=1依次进行堆化

引用JavaGuide的图:

  1. 一开始没排序前的数组(n = 6, 所以要从索引为 3 到 1 的顺序进行堆化):

img

  1. index=3的节点进行堆化:

img

  1. index=2的节点进行堆化

img

  1. 对index=1的节点进行堆化,堆化完成

img

2. 排序

我们在第一步已经建堆完毕,故堆顶元素就是最大值。所以我们重复取出堆顶元素,将这个最大的堆顶元素放至数组末尾,并对剩下的元素进行堆化即可。

  1. 取出堆顶元素并且堆化

img

  1. 一次取出堆顶并且优化

imgimgimgimg


http://www.ppmy.cn/news/1565013.html

相关文章

AI发展困境:技术路径与实践约束的博弈

标题:AI发展困境:技术路径与实践约束的博弈 文章信息摘要: AI技术发展路径主要受实践约束驱动,而非纯理论优势。大型AI实验室的成功更依赖优质执行力和资源优势,而非独特技术创新。当前AI发展面临评估体系与实际应用脱…

kubeneters-循序渐进Ingress

文章目录 overviewIngress 是什么?为什么使用 Ingress?我们会在这里做些什么?HTTP 服务器(Nginx)还能做什么?Kubernetes 中的简单示例:A) 使用 Service ClusterIPB) 手动配置 Nginx 服务作为代理…

登录、注册、忘记密码、首页HTML模板

<!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>登录</title><style>body {display: fl…

mac 安装 node

brew versions node // 安装 node brew versions node14 // 安装指定版本 卸载node: sudo npm uninstall npm -g sudo rm -rf /usr/local/lib/node /usr/local/lib/node_modules /var/db/receipts/org.nodejs.* sudo rm -rf /usr/local/include/node /Users/$USER/.npm su…

MATLAB语言的文件操作

MATLAB语言的文件操作 1. 引言 MATLAB是一种高性能的语言&#xff0c;广泛应用于数学计算、数据分析和可视化等领域。在实际的应用中&#xff0c;经常需要对文件进行操作&#xff0c;包括读取文件、写入文件以及对文件进行修改等。本文将详细探讨MATLAB的文件操作&#xff0c…

2024-春秋杯冬季赛

Misc 简单算术 题目提示异或&#xff0c;直接把开头字符 y 与 f 异或&#xff0c;得到的是不可见字符&#xff0c;base64 编码一下得到异或的字符&#xff0c;将给出的每一个字符与编码后的结果异或即可得到 flag import base64result chr((ord("y") ^ ord("…

小型分布式发电项目优化设计方案

一、项目背景与目标 在能源转型的大趋势下&#xff0c;小型分布式发电项目凭借其高效、灵活等优势&#xff0c;成为满足特定区域用电需求的重要方式。本项目选址于[具体地点]&#xff0c;此地年均日照时长可观&#xff0c;具备良好的太阳能资源开发潜力。项目旨在构建一个稳定…

ChatGPT 写作系列

ChatGPT 辅助写作 | 专栏 1 写作核心​ 先讲一下 ChatGPT 写作的核心。核心就是需要有文章大纲&#xff0c;而且文章大纲要足够细致。​ 具体怎么做呢&#xff1f;​ 提前准备多级标题大纲&#xff0c;刚开始有两个级别的标题就行&#xff0c;等用熟练了再细化。分一级标题&…