数据结构与算法-关于堆的基本排序介绍

news2024/9/17 7:40:31

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快!

文章目录

      • 引言
      • 一、堆排序的基本概念
      • 二、堆排序的步骤
      • 三、堆排序的实现
        • 1. 示例数组
        • 2. 构建最大堆
        • 3. 堆排序
      • 四、堆排序的时间复杂度分析
      • 五、堆排序的空间复杂度分析
      • 六、总结

引言

堆排序是一种基于比较的排序算法,利用堆这种数据结构的特性来进行排序。堆排序的时间复杂度为 O(n log n),并且是一种不稳定的排序算法。本文将深入探讨堆排序的基本原理、实现步骤,并通过具体的案例代码详细说明堆排序的每一个细节。

一、堆排序的基本概念

堆排序的基本概念包括:

  1. :堆是一种特殊的完全二叉树,其中每个节点的值要么大于等于其子节点的值(最大堆),要么小于等于其子节点的值(最小堆)。
  2. 堆序性质:对于最大堆,每个节点的值都不小于其子节点的值;对于最小堆,每个节点的值都不大于其子节点的值。
  3. 完全二叉树:堆通常采用数组形式存储,以便于高效地访问父节点、子节点以及兄弟节点。

二、堆排序的步骤

堆排序的基本步骤如下:

  1. 构建最大堆:将数组构建成一个最大堆。
  2. 交换元素:将堆顶元素(最大值)与堆的最后一个元素交换。
  3. 重新调整堆:将剩余的元素重新调整为最大堆。
  4. 重复步骤2和3:重复此过程,直到堆的大小为1。
    在这里插入图片描述

三、堆排序的实现

接下来,我们将通过一个示例来详细了解堆排序的实现步骤。

1. 示例数组

考虑一个整数数组 arr = [5, 2, 4, 6, 1, 3]

2. 构建最大堆

构建最大堆的过程包括:

  1. 初始化:将数组中的元素按顺序放入数组。
  2. 下沉调整:从最后一个非叶子节点开始,向下调整以保持堆序性质。
def heapify(arr, n, i):
    largest = i
    left = 2 * i + 1
    right = 2 * i + 2

    # 如果左孩子大于根
    if left < n and arr[left] > arr[largest]:
        largest = left

    # 如果右孩子大于当前最大的
    if right < n and arr[right] > arr[largest]:
        largest = right

    # 如果最大的不是根
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]  # 交换
        heapify(arr, n, largest)

def build_max_heap(arr):
    n = len(arr)

    # 从最后一个非叶子节点开始
    for i in range(n // 2 - 1, -1, -1):
        heapify(arr, n, i)

# 示例数组
arr = [5, 2, 4, 6, 1, 3]
build_max_heap(arr)
print("Max Heap:", arr)
3. 堆排序

堆排序的过程包括:

  1. 交换根节点:将最大值(堆顶元素)与数组最后一个元素交换。
  2. 重新调整堆:调整剩余的元素构成新的最大堆。
  3. 重复步骤1和2:直到堆的大小为1。
def heap_sort(arr):
    n = len(arr)

    # 构建最大堆
    build_max_heap(arr)

    # 逐个取出元素
    for i in range(n-1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]  # 交换
        heapify(arr, i, 0)

# 示例数组
arr = [5, 2, 4, 6, 1, 3]
heap_sort(arr)
print("Sorted array:", arr)

四、堆排序的时间复杂度分析

  • 最好情况:堆排序的时间复杂度为 O(n log n)。
  • 最坏情况:堆排序的时间复杂度为 O(n log n)。
  • 平均情况:堆排序的平均时间复杂度为 O(n log n)。

五、堆排序的空间复杂度分析

  • 堆排序是原地排序算法,不需要额外的存储空间,因此其空间复杂度为 O(1)。

六、总结

堆排序是一种高效且稳定的排序算法,它利用堆这种数据结构的特性来进行排序。在实际编程中,堆排序因其稳定的排序特性以及较好的时间复杂度,常常被用作排序算法的标准实现之一。在需要对大量数据进行排序时,堆排序是一个非常好的选择。


喜欢博主的同学,请给博主一丢丢打赏吧↓↓↓您的支持是我不断创作的最大动力哟!感谢您的支持哦😘😘😘
打赏下吧

💝💝💝如有需要请大家订阅我的专栏【数据结构与算法】哟!我会定期更新相关系列的文章
💝💝💝关注!关注!!请关注!!!请大家关注下博主,您的支持是我不断创作的最大动力!!!

数据结构与算法相关文章索引文章链接
数据结构与算法-插入排序数据结构与算法-插入排序
数据结构与算法-希尔排序数据结构与算法-希尔排序
数据结构与算法-归并排序数据结构与算法-归并排序
数据结构与算法-随机快速排序数据结构与算法-随机快速排序
数据结构与算法-双路快速排序数据结构与算法-双路快速排序
数据结构与算法-三路排序数据结构与算法-三路排序
数据结构与算法-关于堆的基本存储介绍数据结构与算法-关于堆的基本存储介绍

❤️❤️❤️觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1959099.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

职场中的六条建议

在职场的征途中&#xff0c;我们每个人都是独一无二的行者&#xff0c;面对挑战与机遇并存的每一天。我们在职场中工作要弄清楚工作的本质&#xff0c;一定要牢记几点&#xff1a; 工作的本质与态度 我们工作的目的就是为了挣钱&#xff0c;我们不是来义务劳动也不是来参加快乐…

【Redis 初阶】Redis 常见数据类型(预备知识、String、哈希、List)

Redis 提供了 5 种数据结构&#xff0c;理解每种数据结构的特点对于 Redis 开发运维非常重要&#xff0c;同时掌握每种数据结构的常见命令&#xff0c;会在使用 Redis 的时候做到游刃有余。 一、预备知识 官方文档&#xff1a;Commands | Docs (redis.io) 1、最核心的两个命令…

npm提示 certificate has expired 证书已过期 已解决

在用npm新建项目时&#xff0c;突然发现报错提示 : certificate has expired 证书已过期 了解一下&#xff0c;在网络通信中&#xff0c;HTTPS 是一种通过 SSL/TLS 加密的安全 HTTP 通信协议。证书在 HTTPS 中扮演着至关重要的角色&#xff0c;用于验证服务器身份并加密数据传输…

python——joblib进行缓存记忆化-对计算结果缓存

问题场景 在前端多选框需要选取多个数据进行后端计算。 传入后端是多个数据包的对应路径。 这些数据包需要按一定顺序运行&#xff0c;通过一个Bag(path).get_start_time() 可以获得一个float时间值进行排序&#xff0c;但由于数据包的特性&#xff0c;这一操作很占用性能和时…

动手学深度学习V2每日笔记(模型初始化和激活函数)

本文主要参考沐神的视频教程 https://www.bilibili.com/video/BV1u64y1i75ap2&vd_sourcec7bfc6ce0ea0cbe43aa288ba2713e56d 文档教程 https://zh-v2.d2l.ai/ 本文的主要内容对沐神提供的代码中个人不太理解的内容进行笔记记录&#xff0c;内容不会特别严谨仅供参考。 1. 模…

Linux安装与配置

下载VMware 首先我们需要下载一个叫VMware的软件&#xff1a; 进入官方下载&#xff0c;地址&#xff1a;https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html选择与自己电脑版本适配的VMware版本【 输入许可证密钥 MC60H-DWHD5-H80U9-6V85…

硬盘分区读不出来的解决之道:从自救到专业恢复

在日常的计算机使用过程中&#xff0c;硬盘分区读不出来的问题常常令人头疼不已。这一问题不仅阻碍了用户对数据的正常访问&#xff0c;还可能预示着数据安全的潜在威胁。硬盘分区读不出来&#xff0c;通常是由于分区表损坏、文件系统错误、物理扇区损坏、驱动程序冲突或硬件连…

流量卡对比?看看哪个运营商的流量卡更适合你?

你用过流量卡吗&#xff1f;在这个一机双卡的时代&#xff0c;大部分的朋友都是人手两张电话卡&#xff0c;甚至更多&#xff0c;其中还包括一张大流量卡&#xff0c;那么&#xff0c;你会选择流量卡吗&#xff1f; ​ 为了冲量和拉新用户&#xff0c;三大运营商都在线上推出一…

优化极限学习机,实现回归预测,三种算法对比,MATLAB代码免费获取

本期将原始蜣螂算法、减法优化器算法、鲸鱼优化算法进行应用。对极限学习机进行优化实现股票回归预测&#xff0c;三种算法相互对比。 股票预测案例 股票数据特征有&#xff1a;开盘价&#xff0c;盘中最高价&#xff0c;盘中最低价&#xff0c;收盘价等。预测值为股票价格。股…

大白话讲清楚GPT嵌入(Embedding)的基本原理

嵌入&#xff08;Embedding&#xff09;是机器学习中的一个基本概念&#xff0c;尤其是在自然语言处理 (NLP) 领域&#xff0c;但它们也广泛应用于其他领域。通常&#xff0c;嵌入是一种将离散的分类数据转换为连续向量的方法&#xff0c;通常在高维空间中&#xff0c;将复杂、…

Jmeter之逻辑控制器(事务控制器+仅一次控制器+吞吐量控制器)-第八天

一.逻辑控制器 1.1事务控制器 事务&#xff0c;其实可以理解为完成一个业务所调用所有接口的集合&#xff0c;当然可以是单个接口&#xff0c;也可以是多个相互关联的串联接口。 所以在进行性能测试时&#xff0c;在用于多接口串联的场景时&#xff0c;需要汇总统计该多个接…

强烈建议产品经理学习AI大模型!

随着GPT大热 “AI大模型”无疑是最火爆的话题&#xff01; Google、百度、腾讯等等巨头互联网公司&#xff0c; 无不在布局人工智能技术和市场&#xff0c; 甚至还有60k*16的高薪&#xff0c;挖掘AI大模型人才&#xff01; 非技术岗的AIGC产品经理&#xff0c; **薪资水平…

html+css+js前端作业和平精英官网1个页面(带js)

htmlcssjs前端作业和平精英官网1个页面&#xff08;带js&#xff09;有轮播图tab切换等功能 下载地址 https://download.csdn.net/download/qq_42431718/89597007 目录1 目录2 项目视频 htmlcssjs前端作业和平精英官网1个页面&#xff08;带js&#xff09; 页面1

leetcode 2236.判断根节点是否等于字节点

1.题目要求: 给你一个 二叉树 的根结点 root&#xff0c;该二叉树由恰好 3 个结点组成&#xff1a;根结点、左子结点和右子结点。如果根结点值等于两个子结点值之和&#xff0c;返回 true &#xff0c;否则返回 false 。2.思路: 直接数组前序遍历&#xff0c;然后判断后面两个…

前端开发的十字路口,薪的出口会是AI吗?

前言 在数字化转型的浪潮中&#xff0c;前端开发一直扮演着至关重要的角色&#xff0c;它连接着用户与产品之间的桥梁。然而&#xff0c;随着技术的不断进步和社会经济环境的变化&#xff0c;前端开发领域也面临着前所未有的挑战和机遇。 前端开发的困境 前端开发领域的竞争…

大模型LLM- 微调P-Tuning v1

P-tuning v1 一文小结 这篇文章介绍了一种名为P-Tuning的新方法&#xff0c;用于改善预训练语言模型&#xff08;PLMs&#xff09;在自然语言理解&#xff08;NLU&#xff09;任务中的性能和稳定性。P-Tuning通过将可训练的连续提示嵌入&#xff08;continuous prompt embeddi…

Javascript前端面试基础(八)

window.onload和$(document).ready区别 window.onload()方法是必须等到页面内包括图片的所有元素加载完毕后才能执行$(document).ready()是DOM结构绘制完毕后就执行&#xff0c;不必等到加载完毕 window.onload 触发时机&#xff1a;window.onload 事件会在整个页面&#xf…

【案例】区分是平行眼还是交叉眼,以及平行眼学习方法

案例一&#xff1a; 交叉眼&#xff1a;看到凸出的“灌水”&#xff0c;即文字好像显示在屏幕前面。PS&#xff1a;看的时候眼睛是斗鸡眼&#xff0c;容易疲劳 平行眼&#xff1a;看到凹陷的“灌水”&#xff0c;即文字好像显示在屏幕后面。PS&#xff1a;看的时候眼睛是平视…

前端JavaScript处理小数精度问题(最佳实践)

前言&#xff1a; 针对于小数精度问题&#xff0c;本次我们主要推荐两种方式&#xff0c;一种是简单的函数封装&#xff0c;一种是使用第三方库big.js。 方法一&#xff1a; 自封装函数搭配parseFloat和toFixed解决小数精度问题&#xff0c;仅适用于解决一般性小数精度问题&…

Java面试八股之简述spring的自动装配

简述spring的自动装配 Spring框架的自动装配&#xff08;Autowiring&#xff09;是一种机制&#xff0c;它允许Spring IoC容器自动满足Bean的依赖关系&#xff0c;而无需显式指定依赖注入的方式。这极大地简化了配置&#xff0c;并有助于减少配置错误。 Spring支持多种自动装…