C++之堆排

 

堆排的原理和结构:

堆排序是一种常见的排序算法,基于堆这种数据结构实现。堆是一种特殊的树形数据结构,它满足以下两个条件:
堆是一棵完全二叉树。
堆的任意节点的值,都必须大于等于(或小于等于)左右子节点的值。
根据这些定义,我们可以将堆分为两种类型:最大堆和最小堆。
最大堆:根节点的值最大,任意节点的值都大于等于其左右子节点的值。
最小堆:根节点的值最小,任意节点的值都小于等于其左右子节点的值。
堆排序分为两个步骤:建堆和排序。
建堆:将待排序元素序列构建为一个堆。具体操作是从后往前遍历所有非叶子节点,逐个调整节点的值,使得它成为一个符合堆的定义的结构。建堆操作时间复杂度为O(n)。
排序:将堆中的元素依次取出,形成有序序列。具体的操作是,将堆顶元素(最大值或最小值)与堆底元素交换,然后将剩余元素重新构建堆。排序操作时间复杂度为O(n*log n)。
因此,堆排序的时间复杂度为O(n*log n),是一种不稳定的排序算法。

data++是什么意思(data)是一个数组?

data++是C语言中的一个表达式,它会将指针data指向的地址向后移动一个存储单位的距离,这里一个存储单位指的是数组的元素大小。如果data是一个数组名,则它代表数组的首元素的地址。

例如,如果data是一个int类型的数组,其大小为 4 字节,那么 data++ 表示将指针data向右移动 4 字节,指向数组中下一个元素的地址。

需要注意的是,由于data是一个指向数组的指针,当使用data++表达式时,会改变指针指向的位置,因此建议在代码中使用时要小心。

当传入一个数组时,这个数组的指针指向哪里?

在C语言中,当使用一个数组名作为实参传递给函数时,实际传递的是数组的第一个元素的地址,即数组名会被转换为一个指向其第一个元素的指针.

void headvisit(int data[],int n)
{
    int i , j , t;
    while(n>1)  //共有n个元素,每一个都要与父节点的值相比较 
    {
        for(i=n/2;i>=1;i--)// n/2是找到最后一个叶子的父节点在树中的位置,当i=1时,就说明此时在根节点处,在树中根节点是从1开始的 并不是0 
        {
            
            if(data[i-1]>data[2*i-1]) //根据树的基本结构 此处是与左孩子比较 
            {
                t = data[2*i-1];
                data[2*i-1] = data[i-1];
                data[i-1] = t;
            }
            
            //先判断右孩子是否存在 右孩子的度一定是小于等于总节点数的(n) 
            if( 2*i+1 <= n && data[i-1] > data[2*i-1+1])
            {
                t = data[2*i-1+1];
                data[2*i-1+1] = data[i-1];
                data[i-1] = t;
            }
        }
        data++; 
        n--;
    }
}

void outs(int data[],int n)
{
    for(int i = 0 ; i < n ; i++)
    {
        printf("%10d",data[i]);
    }
}
int main()
{
    int data[5] = {9,25,444,17536,9456};
    headvisit(data,5);
    outs(data,5);
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于ROS2的costmap中Obstacle Layer中对障碍物信息的增加与删除机制的方案调研。

文章目录 1.背景2.目标3. 障碍物信息添加方式发送数据的数据结构与接收数据的数据结构 4. 障碍物清理机制4.1 可调参数4.2 优化光追算法4.3 障碍物跟踪 1.背景 基于costmap地图&#xff0c;使用navigation导航时&#xff0c;会出现由于激光雷达/图像测距的局限性&#xff0c; …

由浅入深Netty粘包与半包解决方案

目录 1 粘包现象2 半包现象3 现象分析4 解决方案4.1 方法1&#xff1a;短链接4.2&#xff1a;方法2&#xff1a;固定长度4.3 方法3&#xff1a;固定分隔符4.4 方法4&#xff1a;预设长度 1 粘包现象 服务端代码 public class HelloWorldServer {static final Logger log Logg…

【libcurl 】win32 构建 Release版本 修改cmakelist 链接openssl1.1.*

以下库均已MD的构建以vs2019 V142构建MD构建 直接换用了一个openssl库,libcurl连接报错 $(ProjectDir)..\..\..\3rdparty\openssl\xdw_openssl1_1_1\lib\win32\libcrypto.lib

【Unity】 UI自适应案例

UI自适应案例 案例一:背包自动布局1. 创建背包面板2. 背包子项自动布局3. C#代码:动态添加子项到背包中案例二:文字自适应高度1. 创建文字面板2. 组件基本设置3. C#代码:动态更新文字并自适应高度案例一:背包自动布局 需求:动态添加背包组件,设定每行特定个数并自动匹配…

C++学习之路-变量和基本内置类型

变量和基本内置类型 一、基本内置类型1.1 算数类型1.2 带符号类型和无符号类型1.3 类型转换含有无符号类型的表达式 1.4 字面值常量整形和浮点型字面值字符和字符串字面值转义序列指定字面值的类型 二、变量2.1 变量的定义初始化列表初始化默认初始化 2.2 变量声明和定义的关系…

彻底理解粘性定位 - position: sticky(IT枫斗者)

彻底理解粘性定位 - position: sticky 介绍 粘性定位可以被认为是相对定位(position: relative)和固定定位(position: fixed)的混合。元素在跨越特定阈值前为相对定位&#xff0c;之后为固定定位。例如: .sticky-header { position: sticky; top: 10px; }在 视口滚动到元素…

python处理字符串、文本实例及注释

1、多个界定符切割字符串 代码 line = asdf fjdk; afed, fjek,asdf, foo import re re.split(r[;,\s]\s*, line) 结果 在上面的例子中,分隔符可以是逗号,分号或者是空格,并且后面紧跟着任意个的空格。只要这个模式被找到,那么匹配的分隔符两边的实体都会被当成是结果中…

【数据结构与算法】- 期末考试

课程链接: 清华大学驭风计划 代码仓库&#xff1a;Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的&#xff0c;其分为四门课&#xff0c;包括: 机器学习(张敏教授) &#xff0c; 深度学习(胡晓林教授), 计算…

可算是熬出头了,测试6年,费时8个月,入职阿里,涨薪14K

前言 你的努力&#xff0c;终将成就无可替代的自己。 本科毕业后就一直从事测试的工作&#xff0c;和多数人一样&#xff0c;最开始从事点点点的工作&#xff0c;看着自己的同学一步一步往上走&#xff0c;自己还是在原地踏步&#xff0c;说实话这不是自己想要的状态。 一年半…

在 Android 手机上恢复出厂设置后恢复照片的 4 种简单方法(新方法)

“嗨&#xff0c;谁能帮我恢复我的照片&#xff0c;因为我不小心恢复了出厂设置&#xff0c;而且我没有做备份&#xff1f;几个月来我一直试图通过使用恢复软件来恢复我的照片&#xff0c;root 了一个深扫描&#xff0c;但没用……” 恢复出厂设置可以清除电子设备的所有信息并…

Linux安装Redis数据库,无需公网IP实现远程连接

文章目录 1. Linux(centos8)安装redis数据库2. 配置redis数据库3. 内网穿透3.1 安装cpolar内网穿透3.2 创建隧道映射本地端口 4. 配置固定TCP端口地址4.1 保留一个固定tcp地址4.2 配置固定TCP地址4.3 使用固定的tcp地址连接 转发自cpolar内网穿透的文章&#xff1a;公网远程连接…

连续签到积分兑换试用流量主小程序开发

每日签到积分兑换试用流量主小程序开发 打卡兑奖小程序。用户签到活得积分。积分可以兑换商品。观看激励视频广告可以积分翻倍。 用户可以参加试用商品活动参加试用需要提交信息。可以通过分享方式直接获取试用资格。 以下是流量主小程序的功能列表&#xff1a; 广告位管理&a…

Java流程控制(一)

⭐ 控制语句⭐ 条件判断结构(选择结构)⭐ switch 语句 做任何事情事情都要遵循一定的原则&#xff0c;毕竟不以规矩&#xff0c;不成方圆&#xff0c;例如&#xff0c;到图书馆去借书&#xff0c;就必须要有借书证&#xff0c;并且借书证不能过期&#xff0c;这两个条件缺一不可…

Spring Boot 日志处理

Spring Boot 日志处理 Spring Boot 是一个非常流行的 Java 开发框架&#xff0c;它提供了简洁的配置和强大的开发工具。日志是应用程序中必不可少的一部分&#xff0c;因为它可以帮助开发人员进行调试和故障排除。Spring Boot 提供了多种日志框架&#xff0c;本文将重点介绍如…

Java泛型基本知识附面试题

一次平平无奇的面试 为什么要写这篇文档&#xff0c;主要就是在字节二面的时候&#xff0c;面试官提了这么一个问题 面试官&#xff1a;Java中的List<Integer>里有可能存String类型元素吗&#xff1f; 当时的我&#xff1a;应该…不可以吧&#xff0c;好像编译器会报错…

跟我一起使用 compose 做一个跨平台的黑白棋游戏(4)移植到compose-jb实现跨平台

前言 在上一篇文章中&#xff0c;我们已经实现了游戏的所有界面和逻辑代码&#xff0c;并且在 Android 上已经可以正常运行。 这篇文章我们将讲解如何将其从使用 jetpack compose 修改为使用 compose-jb 从而实现跨平台。 老规矩&#xff0c;先看效果图&#xff1a; 可以看到…

BurpSuite—-Target模块(目标模块)

前言 本文主要介绍BurpSuite—-Target模块(目标模块)的相关内容 关于BurpSuite的安装可以看一下之前这篇文章&#xff1a; http://t.csdn.cn/cavWt Target功能 目标工具包含了SiteMap&#xff0c;用你的目标应用程序的详细信息。它可以让你定义哪些对象在范围上为你目前的工…

「车型分析」控制系统典型应用车型 —— 辊筒AGV

辊筒AGV (Roller conveyor ) 是一种常见的AGV机器人类型&#xff0c;它利用辊筒和轮子在巷道中实现货物的搬运和运输&#xff0c;可实现托盘物品的卸载和运输等功能, 具有更高的灵活性、适应性和效率。本文将基于这款市场上常见的AGV进行一次简单的介绍。 1 车型介绍: 辊筒AGV…

Java基础学习(18)反射、动态代理

Java基础学习 一、反射1.1 什么是反射1.2 获取class对象 二、综合练习2.1 保存信息2.2 文件的动态创建 三、动态代理3.1 什么是动态代理3.2 创建代理 一、反射 1.1 什么是反射 反射允许对封装类的字段&#xff0c;方法和构造函数的信息进行编程访问 个人理解&#xff1a; 就是…

Mysql常见的索引模型

目录 有序数组哈希表二叉搜索树B-TreeBTree 有序数组 我们指定一个列为索引&#xff0c;然后按照这个列的值排序&#xff0c;以有序数据存放入数据表中&#xff0c;如下所示 这样&#xff0c;我们在查找数据的时候&#xff0c;就可以通过id这个列&#xff0c;在数据表中进行二…