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

数据结构 | 堆排序

数据结构 | 堆排序

文章目录

  • 数据结构 | 堆排序
      • 建立大堆
      • 排序
      • 结果以及全部代码

如果没有看过堆的实现的话可以先看前面的一章堆的实现,然后再来看这个堆排序,都是比较简单的~~

  • 这里堆排序首先建堆,建堆是要建小堆还是大堆呢?
  • 在堆排序算法中,建立大顶堆的过程是为了确保堆的根节点是整个堆中最大的元素。
    当你需要进行升序排序时,你希望最大的元素排在序列的最后
  • 堆排序的基本思想是首先将待排序的序列构建成一个大顶堆,然后将堆顶元素(最大元素)与堆的最后一个元素交换,接着对剩余的元素重新构建大顶堆,然后再次交换堆顶元素与堆的最后一个元素,如此往复,直到整个序列有序。
  • 建立大顶堆的目的是为了每次交换后,将最大的元素沉到序列的末尾,逐步形成有序的序列。如果你希望升序排序,建立大顶堆是符合这一目标的。

建立大堆

void Swap(HPDataType* p1, HPDataType* p2)
{HPDataType tmp = *p1;*p1 = *p2;*p2 = tmp;
}
void AdjustUp_Big(HPDataType* a, int child)
{int parent = (child - 1) / 2;while (child > 0){if (a[child] > a[parent]){Swap(&a[child], &a[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}

测试一下:

int a[] = { 4,6,2,1,5,8,2,9 };
int sz = sizeof(a) / sizeof(a[0]);
for (int i = 1; i < sz; i++)
{AdjustUp_Big(a, i);
}

排序

void AdjustDown_Big(HPDataType* a, int size, int parent)
{int child = parent * 2 + 1;while (child < size){if (child + 1 < size && a[child + 1] > a[child])++child;if (a[child] > a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}

在这里插入图片描述

//end是在最后一个元素的下标-1
int end = sz - 1;
while (end > 0)
{//根和最后一个值进行交换,最后一个数不看做堆里面的Swap(&a[0], &a[end]);AdjustDown_Big(a, end, 0);--end;
}

结果以及全部代码

void Swap(HPDataType* p1, HPDataType* p2)
{HPDataType tmp = *p1;*p1 = *p2;*p2 = tmp;
}
void AdjustUp_Big(HPDataType* a, int child)
{int parent = (child - 1) / 2;while (child > 0){if (a[child] > a[parent]){Swap(&a[child], &a[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}
void AdjustDown_Big(HPDataType* a, int size, int parent)
{int child = parent * 2 + 1;while (child < size){if (child + 1 < size && a[child + 1] > a[child])++child;if (a[child] > a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}void HeapSort()
{//建大堆int a[] = { 4,6,2,1,5,8,2,9 };int sz = sizeof(a) / sizeof(a[0]);/*for (int i = 1; i < sz; i++){AdjustUp_Big(a, i);}*///向下调整建堆,这样效率更高,上面那个也可以for (int i = (sz - 1 - 1)/2; i >= 0; --i){AdjustDown_Big(a, sz, i);}//打印printf("排序前:");for (int i = 0; i < sz; i++){printf("%d ", a[i]);}printf("\n");//排序//end是在最后一个元素的下标-1int end = sz - 1;while (end > 0){//根和最后一个值进行交换,最后一个数不看做堆里面的Swap(&a[0], &a[end]);AdjustDown_Big(a, end, 0);--end;}//打印printf("排序后:");for (int i = 0; i < sz; i++){printf("%d ", a[i]);}
}

在这里插入图片描述

相关文章:

数据结构 | 堆排序

数据结构 | 堆排序 文章目录 数据结构 | 堆排序建立大堆排序结果以及全部代码 如果没有看过堆的实现的话可以先看前面的一章堆的实现&#xff0c;然后再来看这个堆排序&#xff0c;都是比较简单的~~ 这里堆排序首先建堆&#xff0c;建堆是要建小堆还是大堆呢&#xff1f; 在堆排…...

编程语言发展史:Go语言的设计和特点

一、前言 Go语言是一种由Google开发的编程语言&#xff0c;于2007年开始设计&#xff0c;2009年首次发布。Go语言是一种面向对象、静态类型、编译型的语言&#xff0c;具有高效、简单、安全等特点&#xff0c;可用于开发各种类型的应用程序。Go语言的设计和特点使其成为越来越…...

FinGPT:金融垂类大模型架构

Overview 动机 架构 底座模型&#xff1a; Llama2Chatglm2 Lora训练 技术路径 自动收集数据并整理 指令微调 舆情分析 搜新闻然后相似搜索 检索增强架构 智能投顾 Hugging face 地址 学术成果及未来方向 参考资料...

24. 深度学习进阶 - 矩阵运算的维度和激活函数

Hi&#xff0c;你好。我是茶桁。 咱们经过前一轮的学习&#xff0c;已经完成了一个小型的神经网络框架。但是这也只是个开始而已&#xff0c;在之后的课程中&#xff0c;针对深度学习我们需要进阶学习。 我们要学到超参数&#xff0c;优化器&#xff0c;卷积神经网络等等。看…...

杰发科技AC7801——keil工程移植到IAR

0、简介 发现AC7801的代码只有keil工程的&#xff0c;IAR和Eclipse的代码只有一个例程&#xff0c;于是在从Keil移植到IAR时候遇到的问题记录下。 正常情况下&#xff0c;直接把keil的usr用户代码移植到iar的文件夹下面&#xff0c;删除原本的文件再添加新加进来的文件即可。…...

Word怎么看字数?简单教程分享!

“我在写文章时&#xff0c;总是想看看写了多少字。但是我发现我的Word无法看到字数。在Word中应该怎么查看字数呢&#xff1f;请帮帮我&#xff01;” Word是一个广泛使用的文档编辑工具。在我们编辑文章时&#xff0c;如果想查看写了多少字&#xff0c;也是可以轻松完成的。 …...

万字解析设计模式之观察者模式、中介者模式、访问者模式

一、观察者模式 1.1概述 观察者模式是一种行为型设计模式&#xff0c;它允许一个对象&#xff08;称为主题或可观察者&#xff09;在其状态发生改变时&#xff0c;通知它的所有依赖对象&#xff08;称为观察者&#xff09;并自动更新它们。这种模式提供了一种松耦合的方式&…...

【MySQL | TCP】宝塔面板结合内网穿透实现公网远程访问

文章目录 前言1.Mysql服务安装2.创建数据库3.安装cpolar3.2 创建HTTP隧道4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 宝塔面板的简易操作性&#xff0c;使得运维难度降低&#xff0c;简化了Linux命令行进行繁琐的配置&#x…...

Python break用法详解

Python 语言没有提供 goto 语句来控制程序的跳转&#xff0c;这种做法虽然提高了程序流程控制的可读性&#xff0c;但降低了灵活性。为了弥补这种不足&#xff0c;Python 提供了 continue 和 break 来控制循环结构。本节先讲解 break 的用法。 某些时候&#xff0c;需要在某种…...

【C++初阶】STL详解(五)List的介绍与使用

本专栏内容为&#xff1a;C学习专栏&#xff0c;分为初阶和进阶两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握C。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&…...

MySQL特点和基本语句

MySQL MySQL是一种流行的关系型数据库管理系统&#xff0c;由瑞典MySQL AB公司开发&#xff0c;现属于甲骨文公司&#xff08;Oracle&#xff09;旗下产品。MySQL是基于C语言开发的&#xff0c;它具有高性能、可扩展性、易用性等特点&#xff0c;并且支持大量的用户访问。 My…...

Gin 学习笔记03-参数绑定

参数绑定 1、ShouldBindJSON2、ShouldBindQuery3、ShouldBindUri4、ShouldBind 1、ShouldBindJSON package mainimport ("github.com/gin-gonic/gin""net/http" )type User struct {Name string json:"name"Gender string json:"gender&…...

【100天精通Python】Day73:python机器学习入门算法详解与代码示例

目录 1. 监督学习算法&#xff1a; 1.1 线性回归&#xff08;Linear Regression&#xff09;&#xff1a; 1.2 逻辑回归&#xff08;Logistic Regression&#xff09;&#xff1a; 1.3 决策树&#xff08;Decision Tree&#xff09;&#xff1a; 1.4 支持向量机&#xff…...

Node.js入门指南(四)

目录 express框架 express介绍 express使用 express路由 express 响应设置 中间件 路由模块化 EJS 模板引擎 express-generator hello&#xff0c;大家好&#xff01;上一篇文章我们介绍了Node.js的模块化以及包管理工具等知识&#xff0c;这篇文章主要给大家分享Nod…...

Java LeetCode篇-深入了解关于数组的经典解法

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 轮转数组 1.1 使用移位的方式 1.2 使用三次数组逆转法 2.0 消失的数字 2.1 使用相减法 2.2 使用异或的方式 3.0 合并两个有序数组 3.1 使用三指针方式 3.2 使用合…...

LeeCode前端算法基础100题(4)- 无重复字符的最长子串

一、问题详情&#xff1a; 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2: 输入: s "bbbbb…...

Axios简单使用与配置安装-Vue

安装Axios npm i axios main.js 导入 import Axios from axios Vue.prototype.$axios Axios简单发送请求 get getTest() {this.$axios({method: GET,url: https://apis.jxcxin.cn/api/title?urlhttps://apis.jxcxin.cn/}).then(res > {//请求成功回调console.log(res)}…...

【初始前后端交互+原生Ajax+Fetch+axios+同源策略+解决跨域】

初始前后端交互原生AjaxFetchaxios同源策略解决跨域 1 初识前后端交互2 原生Ajax2.1 Ajax基础2.2 Ajax案例2.3 ajax请求方式 3 Fetch3.1 fetch基础3.2 fetch案例 4 axios4.1 axios基础4.2 axios使用4.2.1 axios拦截器4.2.2 axios中断器 5 同源策略6 解决跨域6.1 jsonp6.2 其他技…...

C语言--每日选择题--Day24

第一题 1. 在C语言中&#xff0c;非法的八进制是&#xff08; &#xff09; A&#xff1a;018 B&#xff1a;016 C&#xff1a;017 D&#xff1a;0257 答案及解析 A 八进制是0&#xff5e;7的数字&#xff0c;所以A错误 第二题 2. fun((exp1,exp2),(exp3,exp4,exp5))有几…...

记一次简单的PHP反序列化字符串溢出

今天朋友给的一道题&#xff0c;让我看看&#xff0c;来源不知&#xff0c;随手记一下 <?php // where is flag error_reporting(0); class NFCTF{ public $ming,$id,$payload,$nothing;function __construct($iii){$this->ming$ii…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...