排序算法(7):堆排序

问题

排序 [30, 24, 5, 58, 18, 36, 12, 42, 39]

堆排序

堆排序是一种基于堆数据结构的排序算法。堆是一个近似完全二叉树的结构,即除了最后一层外,每一层都必须填满,且最后一层从左往右填充。

堆可以分为大根堆和小根堆。在大根堆中,父节点的值总是大于或等于其子节点的值,因此根节点存储的是最大值。在小根堆中,父节点的值总是小于或等于其子节点的值,因此根节点存储的是最小值。二叉堆中两个子节点的大小没有关系。
在这里插入图片描述

图解

堆排序通常使用大根堆来进行升序排序。

  1. 构建大根堆:每次将新插入元素的值与父节点值进行比较,如果新插入的数比父节点大,则与父节点进行交换,一直向上交换直到小于父节点的值或者到达顶端。

    在这里插入图片描述

    如上图所示,在插入 58 时,先与父节点 24 进行比较,发现大于父节点的值,与父节点交换位置;再次与父节点 30 进行比较后交换,直到位于根节点。

    最终生成的大根堆如下图所示:

    在这里插入图片描述
    由图可以看出,一直当前节点为 i,则父节点为 (i - 1) // 2,左子节点为 i * 2 + 1,右子节点为 i * 2 + 2

  2. 固定最大值再重构大根堆:将堆顶的最大值与末位元素进行交换,然后将剩余的数再构建成一个大根堆。

    交换堆顶元素和末位元素,此时最大值 58 来到最后一位固定住,不再参与接下来的排序。
    在这里插入图片描述
    接下来要调整堆顶的元素使剩余的数再次构建一个大根堆:首先将堆顶的数与其左右子节点的最大值进行比较,如果堆顶的数更大,停止;如果堆顶的数小于左右子节点的最大值,则进行位置交换,逐级向下交换直到大于子节点的值或交换到最底层。
    在这里插入图片描述

  3. 重复执行第二步最终得到有序数组

代码

# 构建大根堆(通过新插入的数上升)
def heap_insert(nums):for i in range(1, len(nums)):current = iparent = (current - 1) // 2while parent >= 0 and nums[current] > nums[parent]:nums[current], nums[parent] = nums[parent], nums[current]current = parentparent = (current - 1) // 2return nums# 再构大根堆(通过堆顶的数下沉)
def heapify(arr, i, n):largest = ileft = 2 * i + 1right = 2 * i + 2if left < n and arr[left] > arr[right]:largest = leftif right < n and arr[right] > arr[left]:largest = rightif largest != i:arr[largest], arr[i] = arr[i], arr[largest]heapify(arr, largest, n)# 堆排序
def heap_sort(nums):nums = heap_insert(nums)n = len(nums)while n > 1:nums[0], nums[n-1] = nums[n-1], nums[0]n -= 1nums = heapify(nums, 0, n)return nums

时间复杂度

堆排序的时间复杂度为 O(nlogn)

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

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

相关文章

【余弦相似度】是否需要做归一化

各种标签的向量,做 加权计算后得到一个综合向量,计算余弦相似度之前,可选的,做一个归一化:aggregated_vector /= np.linalg.norm(aggregated_vector)这段代码实现的是 归一化 操作,具体来说,它使用了 L2 范数 来归一化 aggregated_vector 向量。归一化的目的 归一化是为…

多核CPU调度是咋搞的?

其实很多情况下都有 这样的疑问 为什么多核CPU用着用着会“躺平”&#xff1f; 为什么手机有 8 核&#xff0c;跑分时性能却不是核心数的翻倍&#xff1f; 答案的钥匙&#xff0c;就藏在多核CPU的调度机制里。 为了更直观地理解&#xff0c;以一个《王者荣耀》游戏服务器为例…

Qt Quick:CheckBox 复选框

复选框不止选中和未选中2种状态哦&#xff0c;它还有1种部分选中的状态。这3种状态都是Qt自带的&#xff0c;如果想让复选框有部分选中这个状态&#xff0c;需要将三态属性&#xff08;tristate&#xff09;设为true。 未选中的状态值为0&#xff0c;部分选中是1&#xff0c;选…

使用ElasticSearch实现全文检索

文章目录 全文检索任务描述技术难点任务目标实现过程1. java读取Json文件&#xff0c;并导入MySQL数据库中2. 利用Logstah完成MySQL到ES的数据同步3. 开始编写功能接口3.1 全文检索接口3.2 查询详情 4. 前端调用 全文检索 任务描述 在获取到数据之后如何在ES中进行数据建模&a…

【信息系统项目管理师】高分论文:论信息系统项目的进度管理(一体化智能公共数据平台)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文1、规划进度管理2、定义活动3、排列活动顺序5、制定进度计划6、控制进度论文 2022年9月,我作为项目经理参加了XX市的一体化智能公共数据平台项目的建设工作,2022年是XX市政府数字化改革的元年,全市上下…

Docker 设置代理的三种方法(2024年12月19日亲自测试)

Docker 设置代理的三种方法 在 Docker 中设置代理是非常常见的需求&#xff0c;尤其是在某些需要通过代理访问外部资源的网络环境下。本文将介绍三种配置 Docker 使用代理的常见方法&#xff1a;通过 daemon.json 配置镜像加速器、通过 daemon.json 配置 HTTP/HTTPS 代理、以及…

【docker】如何打包前端并运行

前端使用 Vue 3 Vite 1.use npm run preview 运行 0.项目根目录下新建.env文件 VITE_BASE_API_prodhttp://127.0.0.1:5000/api # 线上环境 VITE_MOCK_API_prodapi # 本地模拟数据 VITE_BASE_API_devhttp://127.0.0.1:5000/ap…

【mysql】1205 -Lock wait timeout exceeded; try restarting transaction

问题&#xff1a; mysql8执行SQL提示下面错误&#xff1a; 1205 -Lock wait timeout exceeded; try restarting transaction 1205-超过锁定等待超时&#xff1b;尝试重新启动事务 可能的原因&#xff1a; 事务冲突&#xff1a;多个事务同时尝试修改同一行数据&#xff0c;导…

android 登录界面编写

1、登录页面实现内容 1.实现使用两个EditText输入框输入用户名和密码。 2.使用CheckBox控件记住密码功能。 3.登录时候&#xff0c;验证用户名和密码是否为空。 4.当前CheckBox控件记住密码勾上时&#xff0c;使用SharedPreferences存储用户名和密码。 5.登录时候使用Prog…

LDP+LBP代码解析及应用场景分析

代码整体结构与功能概述 这段 C 代码主要实现了两个图像特征提取算法&#xff0c;分别是局部方向模式&#xff08;Local Directional Pattern&#xff0c;LDP&#xff09;和多分块局部二值模式&#xff08;Multi-Block Local Binary Pattern&#xff0c;Multi-Block LBP&#…

Nuxt样式文件导入

1.在Nuxt导入样式文件的方式 在nuxt中&#xff0c;支持两种样式文件导入的配置。如下&#xff1a; 通过配置文件的css属性指定文件路径。该属性可以支持一个字符串数组&#xff0c;每一项为一个样式文件路径。例如&#xff1a; export default defineNuxtConfig({compatibili…

单元测试使用记录

什么是单元测试 简单来说就是对一个类中的方法进行测试&#xff0c;对输出的结果检查判断是否符合预期结果 但是在多年的工作中&#xff0c;从来没有哪个项目中真正系统的用到了单元测试&#xff0c;因此对它还是很陌生的&#xff0c;也就造成更加不会在项目中区使用它。 如何…

将4G太阳能无线监控的视频接入电子监控大屏,要考虑哪些方面?

随着科技的飞速发展&#xff0c;4G太阳能无线监控系统以其独特的优势在远程监控领域脱颖而出。这种系统结合了太阳能供电的环保特性和4G无线传输的便捷性&#xff0c;为各种环境尤其是无电或电网不稳定的地区提供了一种高效、可靠的视频监控解决方案。将这些视频流接入大屏显示…

Linux C 程序 【05】异步写文件

1.开发背景 Linux 系统提供了各种外设的控制方式&#xff0c;其中包括文件的读写&#xff0c;存储文件的介质可以是 SSD 固态硬盘或者是 EMMC 等。 其中常用的写文件方式是同步写操作&#xff0c;但是如果是写大文件会对 CPU 造成比较大的负荷&#xff0c;采用异步写的方式比较…

曲线的测地曲率

测地曲率 设 S : r ( u , v ) S:r(u,v) S:r(u,v)是曲面&#xff0c; γ ( s ) r ( u ( s ) , v ( s ) ) \gamma(s)r(u(s),v(s)) γ(s)r(u(s),v(s))是 S S S上的一条弧长参数化曲线。 1.称 K g ( s ) D γ ˙ d s ( γ ( s ) ) T \mathbb{K}_g(s)\frac{D\dot{\gamma}}{d\b…

js常用方法之: 预览大图(uniapp原生方法封装)

方法: //预览图片 pic可传单个图片地址字符串 或 图片数组(带index) previewPic: function(pic, index) {if (!pic) return;if (index undefined) {let array [];array.push(pic);uni.previewImage({urls: array,current: array[0]});} else {uni.previewImage({urls: pic,…

重拾设计模式--原型模式

文章目录 原型模式定义原型模式UML图优点缺点使用场景C 代码示例深拷贝、浅拷贝 原型模式定义 用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型创建新的对象&#xff1b; 核心中的核心就是 克隆clone ,后面讲 原型模式是一种创建型设计模式&#xff0c;它的主要…

flutter --no-color pub get 超时解决方法

新建Flutter项目后&#xff0c;运行报错&#xff0c;需要执行pub get 点击Run ‘flutter pub get’ … … … 卡着&#xff0c;不动了&#xff0c;提示超时 是因为墙的问题 解决方案&#xff1a; 添加以下环境变量 变量名: PUB_HOSTED_URL 变量值: https://pub.flutter-io.cn …

如何详细步骤地进行Z-Blog博客系统的安装过程?

安装Z-Blog博客系统的步骤如下&#xff1a; 下载Z-Blog软件包&#xff1a;根据你的操作系统&#xff0c;选择相应的Z-Blog软件包进行下载。在Z-Blog官方网站上&#xff0c;你可以找到最新版本的Z-Blog软件包。 解压软件包&#xff1a;将下载的Z-Blog软件包解压到你的服务器或本…

【C++】优先级队列以及仿函数

本篇我们来介绍一下优先级队列 priority_queue 。优先级队列的底层是数据结构中的堆&#xff0c;在C中它是一个容器适配器&#xff0c;这个容器适配器比之前的栈和队列更复杂。 1.priority_queue的介绍 1.1 优先级队列的底层 因为优先级队列就是堆&#xff0c;堆的底层是数组…