数据结构与算法系列之堆排序

在这里插入图片描述

💗 💗 博客:小怡同学
💗 💗 个人简介:编程小萌新
💗 💗 如果博客对大家有用的话,请点赞关注再收藏 🌞

堆的概念和结构

如果有一个关键码的集合K = { , , ,…, },把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足: <= 且 <= ( >= 且 >= ) i = 0,1,2…,则称为小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。
//堆中某个节点的值总是不大于或不小于其父节点的值;
//堆总是一棵完全二叉树

在这里插入图片描述

在这里插入图片描述

堆的实现

堆的向上调整

使用场景:建堆,堆的插入
建堆时间复杂度O( N*logN)

void AdjustUp(int* a, int child)
{int parent = (child - 1) / 2;while ( child > 0 ){if (a[parent] < a[child]){swap(&a[parent], &a[child]);child = parent;parent = (child - 1) / 2;}else{break;}}
}

堆的向下调整

使用场景:建堆,堆的删除,堆的排序
建堆时间复杂度O(N)

void AdjustDown(int* a,int parent,int n)
{for(int child = parent * 2 + 1; child <n; child=child*2+1){if (child + 1 < n && a[child] <  a[child + 1]){child++;}if (a[child] > a[parent]){swap(&a[child], &a[parent]);parent = child;}else{break;}}
}

堆的创建和堆的排序

`void HeapSort(int* a, int n)
{int end = n - 1;//向上建堆for (int i =0 ; i < n; i++){AdjustUp(a, i);}//向下建堆/*for (int i = (end - 1) / 2; i >= 0 ;i--){AdjustDown(a, i, n);}*while (end>=1){swap(&a[0], &a[end]);AdjustDown(a, 0,end);end--;}
}

习题:求前K个最大或最小的元素(数量多的情况下)

void AdjustUp(int* a, int child)
{int parent = (child - 1) / 2;while ( child > 0 ){if (a[parent] > a[child]){swap(&a[parent], &a[child]);child = parent;parent = (child - 1) / 2;}else{break;}}
}void AdjustDown(int* a,int parent,int n)
{int child = parent * 2 + 1;for(int child = parent * 2 + 1; child <n; child=child*2+1){if (child + 1 < n && a[child]  > a[child + 1])//这里注意大小堆的区别 小堆选小 大堆选大{child++;}if (a[child] < a[parent]){swap(&a[child], &a[parent]);parent = child;}else{break;}}
}void HeapSort(int* a, int n,int k)
{int end = n - 1;//向上建堆int i = 0;for (i =0 ; i < k; i++){AdjustUp(a, i);}//向下建堆/*for (int i = (end - 1) / 2; i >= 0 ;i--){AdjustDown(a, i, n);}*///求前k个最大数建k次小堆,与小堆堆顶相比,//比堆顶大就向下调整while (i < n){if (a[0] < a[i]){swap(&a[0], &a[i]);AdjustDown(a, 0, k);}i++;}
}

在这里插入图片描述

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

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

相关文章

Linux之tar归档命令

目录 Linux之tar归档命令 定义 语法格式 参数及作用 常用选项 创建&#xff08;非压缩的&#xff09;包文件 ​编辑 创建带压缩的包文件 列出包文件中的文件列表 提取包文件到指定目录 tar打包时排除 --exclude -X或--exclude-from Linux之tar归档命令 定义 用于打…

替换jar包中的yml,class等文件的方法

文章目录 1.使用场景2.先准备好待替换的文件3.下载服务器上的jar包4.解压出来指定的文件5.将文件打入jar包6.查看是否替换成功 1.使用场景 由于线上项目中突然爆出一个bug问题&#xff0c;影响到用户使用&#xff0c;但是 线上的jar包版本&#xff0c;已经是很久的了&#xff…

密码学

第四章&#xff1a;安全性和电子商务 安全性在商业系统中是非常重要的&#xff0c;不管这些系统是基于物理交易还是电子交易。在现实世界中&#xff0c;我们在很大程度上依赖于物理的安全性&#xff0c;而在电子商务中&#xff0c;我们必须更加依赖于用电子的方式来保护数据&a…

在网站添加客服QQ,打开临时会话框(不用加为好友)

转自 : https://blog.csdn.net/wbbott/article/details/53107009 我们是不是经常在浏览网站的时候&#xff0c;会发现有一个联系客服QQ的功能&#xff0c;但是这个具体的功能应该怎么做呢? 有些同学可能会说&#xff0c;在网页代码加上一段代码就OK了。但是你发现没有&#xf…

在网站添加客服QQ,打开临时回话框(不用加为好友)

我们是不是经常在浏览网站的时候&#xff0c;会发现有一个联系客服QQ的功能&#xff0c;但是这个具体的功能应该怎么做呢? 有些同学可能会说&#xff0c;在网页代码加上一段代码就OK了。但是你发现没有&#xff0c;这时候会出现一个加为好友的QQ对话框&#xff01; 然后呢&am…

oracle删除临时会话表,新一代QQ群机器人

新一代QQ群机器人是一款集论坛QQ机器人、QQ群互联管理功能、支持市场主流数据库对接机器人问答库为一体多功能的QQ群辅助机器人工具&#xff0c;能够实时通知QQ、QQ群&#xff0c;发帖、回帖通知&#xff0c;图文消息&#xff0c;自定义转发格式强大的QQ群管理&#xff0c;支持…

发送临时文件被服务器拒绝,临时会话说服务器拒绝了您发送离线文件的请求 - 卡饭网...

qq 服务器拒绝了您发送离线文件请求的解决方法 qq 服务器拒绝了您发送离线文件请求的解决方法 qq服务器拒绝了您发送离线文件的原因&#xff1f;在我们日常工作中&#xff0c;因工作需要会用上qq离线文件接收、发送。而前面小编也讲解了这方面的问题&#xff0c;但是有的时候qq…

iOS调用QQ客户端发起临时会话

一.前言: 前段时间项目中有个需求,在App内调用QQ客户端,在不是好友前提下,向指定的客服QQ发起临时会话,很简单的一个需求,但是实际实现起来却碰到很多问题. 1.QQ开发者平台,并没有找到App调用QQ客户端发起临时会话方法,(只提供了网页端接入方法) 2.网上搜到的一些方法,大部分都…

QQ临时会话框运用

最近公司项目要用到QQ临时会话功能&#xff0c;在网上有很多文章都提到这个东西怎么去做&#xff0c;经过实践&#xff0c;具体做法可以分为以下几步&#xff1a; 1&#xff09;准备一个QQ账号A用于临时会话。客户QQ账号B将与该账号建一个立起临时会话&#xff0c;进行离线留言…

设置QQ支持临时会话

转自&#xff1a;http://www.54kefu.net/linshi/201202/391.html 没设置临时会话&#xff0c;一般都会出现下面的状况。QQ放在网站上作为客服&#xff0c;必须设置临时会话。 &#xff08;1&#xff09; &#xff08;2&#xff09; &#xff08;3&#xff09;或者点击之后&…

QQ支持临时会话设置

没设置临时会话&#xff0c;一般都会出现下面的状况。QQ放在网站上作为客服&#xff0c;必须设置临时会话。 &#xff08;1&#xff09; &#xff08;2&#xff09; &#xff08;3&#xff09;或者点击之后&#xff0c;要求加为好友才可以对话。 解决这个问题的步骤如下&#x…

01 云原生生态系统解读

云计算的技术革命 互联网时代的历程 云计算到底是什么 云计算历程 云平台的优缺点 优势 稳定性&#xff1a;云平台大量资源&#xff0c;分布式集群部署&#xff0c;保障服务永不宕机&#xff0c;几个9弹性扩展&#xff1a;按需索取&#xff0c;一键秒级开通需要的资源安全性&…

100天精通Golang:全面掌握Go语言的旅程

&#x1f337; 博主 libin9iOak带您 Go to Golang Language.✨ &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &#x1f30a; 《I…

Hopfield神经网络与受限波尔兹曼机

神经网络可分为两大类&#xff1a; 一类是多层神经网络、卷积神经网络&#xff1a;可用于模式识别另一类是相互连接型网络&#xff1a;可通过联想记忆去除输入数据中的噪声。 深度学习目录&#xff1a; 自适应线性单元 (Widrow and Hoff, 1960)神经认知机 (Fukushima, 1980)…

Tomcat部署及优化

目录 一、Tomcat的相关知识 1&#xff09;Tomcat的简介 2&#xff09;Tomcat的组件构成 3&#xff09;Tomcat的功能组件结构 4&#xff09;Tomcat的请求过程 二、Tomcat服务的部署 步骤一&#xff1a;搭建Tomcat运行环境 &#xff08;1&#xff09;关闭防火墙和s…

【Linux】Linux内核编译与入门

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Linux内核编译。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习知识&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&am…

AI绘画软件排行榜,手机AI绘画排名推荐

AI绘画技术近年来成为数字艺术的新热点。随着人工智能技术的不断发展和普及&#xff0c;越来越多的网站开始推出AI绘画功能&#xff0c;在保证人工智能算法的同时&#xff0c;也不断丰富绘画功能和操作体验。下面就为大家盘点一下目前最受欢迎的AI绘画网站。 AI绘画软件排名推荐…

SAI 绘图软件+笔刷+教程

SAI绘画软件一直以来都是许多插画师首选的绘画工具&#xff0c;这款软件兼容几乎所有型号的绘画板&#xff0c; 通过SAI绘画软件可以很好的表现出CG风格和水彩风格&#xff0c;在线条绘制方面比目前已用过的任何软件 都更****、更逆天&#xff0c;线条废柴们的福音!初音的某人…

SAI v2.0小巧强大的板绘工具

SAI v2.0是由日本SYSTEMAX公司推出的一款非常专业的绘图软件&#xff0c;基于SAI1.0的基础上&#xff0c;SAI2.0增加了更多更强大的功能。尤其是任意角度的自由旋转、画布视图大小缩放等等&#xff0c;很多功能就在主操作版上&#xff0c;用起来非常方便快捷。sai v2.0拥有丰富…

原画师需要用到什么工具?绘画工具大全!

游戏行业这几年持续升温&#xff0c;网游火了几年&#xff0c;又轮到手游和页游。但是不管哪个平台的游戏&#xff0c;研发都需要游戏原画环节。 一、学习原画漫画需要用到的软件主要有以下三款&#xff1a; 1.PS: PS是公认最强大的图片编辑软件,正因为强大所以功能繁多导致过于…