当前位置: 首页 > news >正文

排序算法--堆排序【图文详解】

“留在码头的船才最安全” “但亲爱的,那不是造船的目的。

堆--插入heapInsert

原来有一个大根堆,如图:

  • 现在要新插入一个数字50,进行插入

  • 流程:和父亲相比,如果比父亲大,和父亲交换,直到不比父亲大,或者来到0位置

void heapInsert(vector<int>& arr, int i) {while (arr[i] > arr[(i - 1) / 2]) {swap(arr[i], arr[(i - 1) / 2]);i = (i - 1) / 2;}
}
  • 插入50

  • 50比13大,交换

  • 50比20大,交换

  • 50比40大,交换

调整成功!

  • 由于完全二叉树有n个节点,会有logn深度,因此插入的时间复杂度是O(logn)

堆调整 heapify

还是上面的那个例子,想把0位置的40,改为4,此时破坏了大根堆的性质,如何调整?

  • 假设当前下标为i,如果i位置有左孩子和右孩子,则左孩子的下标为l=i*2+1,右孩子为l+1

  • 左右孩子比较出最大的孩子

  • 最大的孩子和当前数字比较,如果孩子大,那么交换,如果是自己大,那么不动

  • 4和20交换

  • 4和13交换

  • 堆调整完成,时间复杂度O(logn)

void heapify(vector<int>& arr, int i, int size) {//可能没有左孩子int l = i * 2 + 1;//左孩子下标while (l < size) {//有左孩子//右孩子:l+1//评选,左右孩子的最强的孩子下标是什么//1次比较!!int best = l + 1 < size && arr[l + 1] > arr[l] ? l + 1 : l;//上面已经选最强的孩子,接下来,当前的数字,和最强的孩子之前,最强下标是谁?//2次比较!!best = arr[best] > arr[i] ? best : i;if (best == i) {break;//最强的是自己,不用向下调整了}//最强孩子比自己更强swap(arr[best], arr[i]);i = best;l = i * 2 + 1;}
}

堆排序

  • 从顶到底建立堆的时间复杂度是O(nlogn)

  • 大数归为的时间复杂度是O(nlogn)

  • 因此总时间复杂度O(nlogn)

void heapInsert(vector<int>& arr, int i) {while (arr[i] > arr[(i - 1) / 2]) {swap(arr[i], arr[(i - 1) / 2]);i = (i - 1) / 2;}
}
void heapify(vector<int>& arr, int i, int size) {//可能没有左孩子int l = i * 2 + 1;//左孩子下标while (l < size) {//有左孩子//右孩子:l+1//评选,左右孩子的最强的孩子下标是什么//1次比较!!int best = l + 1 < size && arr[l + 1] > arr[l] ? l + 1 : l;//上面已经选最强的孩子,接下来,当前的数字,和最强的孩子之前,最强下标是谁?//2次比较!!best = arr[best] > arr[i] ? best : i;if (best == i) {break;//最强的是自己,不用向下调整了}//最强孩子比自己更强swap(arr[best], arr[i]);i = best;l = i * 2 + 1;}
}void heapsort1(vector<int>& arr) {//1.建堆int n = arr.size();for (int i = 0;i < n;i++) {heapInsert(arr,i);}//2.大数归位int size = n;while (size > 1) {swap(arr[0], arr[--size]);//0位置的数字和最后一个交换heapify(arr, 0, size);//再调整0位置这个数字}
}
  • 从底到顶建堆时间复杂度是O(n),会比自顶向底快一点,但总的时间复杂度不变,都是O(nlogn)

  • 大数归为的时间复杂度是O(nlogn)

  • 因此总时间复杂度O(nlogn)

void heapify(vector<int>& arr, int i, int size) {//可能没有左孩子int l = i * 2 + 1;//左孩子下标while (l < size) {//有左孩子//右孩子:l+1//评选,左右孩子的最强的孩子下标是什么//1次比较!!int best = l + 1 < size && arr[l + 1] > arr[l] ? l + 1 : l;//上面已经选最强的孩子,接下来,当前的数字,和最强的孩子之前,最强下标是谁?//2次比较!!best = arr[best] > arr[i] ? best : i;if (best == i) {break;//最强的是自己,不用向下调整了}//最强孩子比自己更强swap(arr[best], arr[i]);i = best;l = i * 2 + 1;}
}void heapsort2(vector<int>& arr) {int n = arr.size();for (int i = n - 1;i >= 0;i--) {heapify(arr, i, n);}//2.大数归位和heapsort1一样的代码int size = n;while (size > 1) {swap(arr[0], arr[--size]);heapify(arr, 0, size);}
}

相关文章:

排序算法--堆排序【图文详解】

“留在码头的船才最安全” “但亲爱的&#xff0c;那不是造船的目的。 堆--插入heapInsert 原来有一个大根堆&#xff0c;如图&#xff1a; 现在要新插入一个数字50&#xff0c;进行插入 流程&#xff1a;和父亲相比&#xff0c;如果比父亲大&#xff0c;和父亲交换&#xff…...

FCBP 认证考试要点摘要

理论知识 数据处理与分析&#xff1a;包括数据的收集、清洗、转换、存储等基础操作&#xff0c;以及数据分析方法&#xff0c;如描述性统计分析、相关性分析、数据挖掘算法等的理解和应用 。数据可视化&#xff1a;涉及图表类型的选择与应用&#xff0c;如柱状图、折线图、饼图…...

鸿蒙生态崛起的机遇有什么

鸿蒙生态系统的崛起为各个领域带来了多个机遇&#xff0c;主要体现在以下几个方面&#xff1a; 智能设备的互联互通&#xff1a;鸿蒙系统旨在实现不同设备之间的无缝连接&#xff0c;为物联网&#xff08;IoT&#xff09;设备的发展提供了良好的基础。这将推动智能家居、智慧城…...

基础(函数、枚举)错题汇总

枚举默认从0开始&#xff0c;指定后会按顺序赋值 而这个枚举变量X&#xff0c;如果在全局&#xff08;函数外部&#xff09;定义&#xff0c;那默认为0&#xff0c;如果在函数内部&#xff08;局部变量&#xff09;&#xff0c;那就是随机值&#xff0c;必须初始化。 枚举变量…...

【Spark源码分析】规则框架- `analysis`分析阶段使用的规则

analysis分析阶段使用的规则 规则批策略规则说明SubstitutionfixedPointOptimizeUpdateFields该规则优化了 UpdateFields 表达式链&#xff0c;因此看起来更像优化规则。但是&#xff0c;在处理深嵌套模式时&#xff0c;UpdateFields 表达式树可能会非常复杂&#xff0c;导致分…...

mysql--二进制安装编译安装yum安装

二进制安装 创建用户和组 [rootlocalhost ~]# groupadd -r -g 306 mysql [rootlocalhost ~]# useradd -r -g 306 -u 306 -d /data/mysql mysql 创建文件夹并添加所属文件用户和组 [rootlocalhost ~]# mkdir -p /data/mysql [rootlocalhost ~]# chown mysql:mysql /data/mysql …...

《Django 5 By Example》阅读笔记:p339-p358

《Django 5 By Example》学习第12天&#xff0c;p339-p358总结&#xff0c;总计20页。 一、技术总结 1.项目(购物网站) django-admin startproject myshop 虽然这里只是示例&#xff0c;但我觉得这种命名为 myxxx 的习惯非常不好&#xff0c;因为在实际应用中&#xff0c;是…...

鸿蒙修饰符

文章目录 一、引言1.1 什么是修饰符1.2 修饰符在鸿蒙开发中的重要性1.3 修饰符的作用机制 二、UI装饰类修饰符2.1 Styles修饰符2.1.1 基本概念和使用场景2.1.2 使用示例2.1.3 最佳实践 2.2 Extend修饰符2.2.1 基本概念2.2.2 使用示例2.2.3 Extend vs Styles 对比2.2.4 使用建议…...

springboot359智慧草莓基地管理系统(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;智慧草莓基地管理系统 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本智慧草莓基地管理系统就…...

单片机位数对性能会产生什么影响?!

单片机的位数是指其处理器核心的位宽&#xff0c;通常以比特&#xff08;bit&#xff09;为单位。常见的位数有8位、16位、32位和64位等。 单片机位数越高&#xff0c;处理器能够处理的数据量越大&#xff0c;性能也相应提高。 以下是对单片机位数对性能影响的详细分析&#…...

stm32内部高速晶振打开作为主时钟

首先建议你别这么干&#xff0c;因为内部晶振特别容易受温度等外界影响&#xff0c;很容易卡死或堵死程序 我是因为没画外部晶振电路&#xff0c;所以只能开内部晶振来作为时钟 适用于stm32f103系列 把下面的代码换掉源文件里的时钟源配置 /* 开启HSI 即内部晶振时钟 */RCC…...

【分页查询】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…...

【CSS in Depth 2 精译_061】9.4 CSS 中的模式库 + 9.5 本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第九章 CSS 的模块化与作用域】 ✔️ 9.1 模块的定义 9.1.1 模块和全局样式9.1.2 一个简单的 CSS 模块9.1.3 模块的变体9.1.4 多元素模块 9.2 将模块组合为更大的结构 9.2.1 模块中多个职责的拆分…...

惠普电脑切换默认F1至F12快捷键,FN切换

发现新买的惠普电脑&#xff0c;按F1至F12发现是快捷功能键&#xff0c;而按fnF1至F12才是windows的功能键和正常我自己使用的电脑刚好相反&#xff0c;实在太不方便了。 解决办法需要进入biso里面去把功能键模式选中给关掉&#xff0c;才能恢复回来...

计算机的错误计算(一百七十)

摘要 回复一中学生来信&#xff0c;探讨 MATLAB 关于算式 的计算问题。 在计算机的错误计算&#xff08;一百三十二&#xff09;中&#xff0c;我们探讨了手持式计算器关于算式 的计算问题。一中学生来信询问该算式在数学软件中是否会出错。 例1. 在 MATLAB 中计算 . 首…...

Python `async def` 函数中使用 `yield` 和 `return` 的区别

Python async def 函数中使用 yield 和 return 的区别 1. return 的使用示例代码输出结果解释 2. yield 的使用示例代码输出结果解释 3. 总结 在 Python 中&#xff0c;async def 函数用于定义异步函数&#xff0c;这些函数可以在执行过程中暂停和恢复&#xff0c;通常与 await…...

JAVA修饰符

JAVA 修饰符...

Java 单例模式:深度解析与应用

在软件开发领域&#xff0c;设计模式是解决常见设计问题的有效方案&#xff0c;而单例模式作为创建型设计模式中的一员&#xff0c;其重要性不容小觑。它能够确保一个类仅有一个实例&#xff0c;并提供全局访问点&#xff0c;这一特性在资源管理、配置信息读取、线程池管理以及…...

软件质量保证——单元测试之白盒技术

笔记内容及图片整理自XJTUSE “软件质量保证” 课程ppt&#xff0c;仅供学习交流使用&#xff0c;谢谢。 程序图 程序图定义 程序图P&#xff08;V,E&#xff09;&#xff0c;V是节点的集合&#xff08;节点是程序中的语句或语句片段&#xff09;&#xff0c;E是有向边的集合…...

Vue0-生命周期-03

生命周期 生命周期指定就是一个对象从创建到销毁的整个过程。 Vue也是有的 完整的Vue周期包含8个阶段。 Vue官方生命周期流程图&#xff1a; 那这有什么用呢&#xff1f;我们可以在指定阶段做特殊的事件。 这些方法伴随生命周期的进行自动执行。 <!DOCTYPE html> <…...

SpringBoot的服装商城系统毕设源码

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在构建一个基于Spring Boot与Vue框架的服装商城系统以解决传统电商平台在用户体验优化与业务逻辑实现方面的局限性。当前电子商务领域面临商品信息展示不…...

Java基础——抽象类与接口

前言&#xff1a; 在Java面向对象编程中&#xff0c;抽象类&#xff0c;接口&#xff0c;内部类以及Object类是构建灵活&#xff0c;可拓展代码的核心工具。理解它们的区别与联系&#xff0c;掌握使用场景&#xff0c;是每一位Java开发者进阶的必经之路。 本文将结合通俗易懂的…...

第三篇:变量

一.变量 1.变量的创建 &#xff08;1&#xff09;语法格式&#xff1a;data_type name; 补充&#xff1a;其中“data_type"是数据类型&#xff0c;”name"是变量名&#xff0c;变量名根据需求随意取即可&#xff0c;但尽量取得有意义 例如&#xff1a;int age 10;(创…...

TTS听觉校对法:技术写作质量提升的工程实践指南

1. 为什么我们需要“听”自己的文字&#xff1a;一个被忽视的校对革命作为一名写了十几年技术文档和博客的老兵&#xff0c;我敢说&#xff0c;最让我头疼的不是构思&#xff0c;也不是码字&#xff0c;而是最后那一步——校对。你肯定也经历过&#xff1a;一封精心撰写的邮件发…...

AI编程工具全景指南:从CLI到智能体,构建高效开发工作流

1. 项目概述&#xff1a;一份为“氛围编码”时代量身定制的开发者地图如果你是一名开发者&#xff0c;最近几个月一定被“氛围编码”这个词刷屏了。从Cursor、Claude Code到各种AI原生IDE和代理工具&#xff0c;我们仿佛一夜之间进入了一个新的编程范式。但问题也随之而来&…...

基于MCP协议的Burp Suite AI安全测试插件部署与应用实战

1. 项目概述&#xff1a;当Burp Suite遇见MCP&#xff0c;安全测试的“智能副驾”来了如果你是一名Web安全测试工程师或者渗透测试人员&#xff0c;Burp Suite这个名字对你来说&#xff0c;就像木匠手里的锤子一样熟悉。它几乎是手动安全测试的代名词&#xff0c;从拦截代理到漏…...

AI智能体技能管理:MCP服务器安装配置与实战指南

1. 项目概述&#xff1a;一个为AI智能体管理“技能”的MCP服务器 最近在折腾AI智能体&#xff08;Agent&#xff09;开发的朋友&#xff0c;应该都遇到过同一个痛点&#xff1a;想让你的Claude、GPT或者Gemini去执行一些特定的、复杂的任务&#xff0c;比如调用某个API、处理特…...

CANN/ops-nn组归一化算子

aclnnGroupNorm 【免费下载链接】ops-nn 本项目是CANN提供的神经网络类计算算子库&#xff0c;实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-nn &#x1f4c4; 查看源码 产品支持情况 产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列…...

【信息科学与工程学】【通信工程】第二篇 网络的主要算法10 容器网络

容器与虚拟机对比特征表 特征维度 容器特征函数 虚拟机特征函数 技术实现差异 性能影响 适用场景 1. 资源隔离​ container_isolation(namespace, cgroup) 函数说明:基于Linux命名空间和cgroup的资源隔离 输入:namespace_type, cgroup_config 输出:isolation_level(0…...

CANN/asc-devkit向量减法ReLU函数

asc_sub_relu 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言&#xff0c;原生支持C和C标准规范&#xff0c;主要由类库和语言扩展层构成&#xff0c;提供多层级API&#xff0c;满足多维场景算子开发诉求。 项目地址: https://gitcode.c…...