堆在排序中的应用

堆排序

1、堆排序原理

堆排序是利用到了堆这种数据结构,我们首先回顾一下二叉堆的特性:

  1. 最大堆的堆顶是整个堆中的最大元素。
  2. 最小堆的堆顶是整个堆中的最小元素。

以最大堆为例,如果删除一个最大堆的堆顶(并不是完全删除,而是跟末尾的节点交换位置),经过自我调整,第2大的元素就会被交换上来,成为最大堆的新堆顶。如下图所示:

image-20231129192614158

在删除值为10的堆顶节点后,经过调整,值为9的新节点就会顶替上来;在删除值为9的堆顶节点后,经过调整,值为8的新节点就会顶替上来……

由于二叉堆的这个特性,每一次删除旧堆顶,调整后的新堆顶都是大小仅次于旧堆顶的节点。那么只要反复删除堆顶,反复调整二叉堆,所得到的集合就会成为一个有序集合。

而二叉堆实际是存储在数组中的,堆排序过后数组中的元素排列如下:

image-20231129192924869

综上,堆排序的步骤为:

  1. 把无序数组构建成二叉堆。需要从小到大排序,则构建成最大堆;需要从大到小排序,则构建成最小堆。
  2. 循环删除堆顶元素,替换到二叉堆的末尾,调整堆产生新的堆顶。

2、堆排序的代码实现

堆排序的代码如下如下(升序排列):

/**
 * “下沉”调整
 * @param array 待调整的堆
 * @param parentIndex 要“下沉”的父节点
 * @param length 堆的有效大小
 */
public static void downAdjust(int[] array, int parentIndex,int length) {
	// temp 保存父节点值,用于最后的赋值
	int temp = array[parentIndex];
	int childIndex = 2 * parentIndex + 1;
	while (childIndex < length) {
		// 如果有右孩子,且右孩子大于左孩子的值,则定位到右孩子
		if (childIndex + 1 < length && array[childIndex + 1] >array[childIndex]) {
            childIndex++;
		}
		// 如果父节点大于任何一个孩子的值,则直接跳出
		if (temp >= array[childIndex])
			break;
		//无须真正交换,单向赋值即可
		array[parentIndex] = array[childIndex];
		parentIndex = childIndex;
		childIndex = 2 * childIndex + 1;
	}
	array[parentIndex] = temp;
}


/**
 * 堆排序(升序)
 * @param array 待调整的堆
 */
public static void heapSort(int[] array) {
	// 1. 把无序数组构建成最大堆
	for (int i = (array.length-2)/2; i >= 0; i--) {
		downAdjust(array, i, array.length);
	}
	System.out.println(Arrays.toString(array));
	// 2. 循环删除堆顶元素,移到集合尾部,调整堆产生新的堆顶
	for (int i = array.length - 1; i > 0; i--) {
	// 最后1个元素和第1个元素进行交换
	int temp = array[i];
	array[i] = array[0];
	array[0] = temp;
	// “下沉”调整最大堆
	downAdjust(array, 0, i);
}

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

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

相关文章

【MATLAB】RLMD分解+FFT+HHT组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 RLMD分解FFTHHT组合算法是一种强大的分析方法&#xff0c;结合了局部均值分解&#xff08;LMD&#xff09;、快速傅里叶变换&#xff08;FFT&#xff09;和希尔伯特-黄变换&#xff08;H…

Wireshark之Intro, HTTP, DNS

源码地址&#x1f447; moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES: 《计算机网络&#xff0d;自顶向下方法(原书第6版)》编程作业&#xff0c;Wireshark实验文档的翻译和解答。 (github.com) 目录 &#x1f33c;Introduce &#x1f3a7;前置 &#x1f3a7;过…

基于YOLOv8深度学习的PCB板缺陷检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐--…

基于three.js生成动态波浪背景效果

文章目录 前言一、安装three二、新建waves.js文件三、引入waves.js文件比查看效果如有启发&#xff0c;可点赞收藏哟~ 前言 基于three.js生成动态波浪背景效果 一、安装three npm i three -S二、新建waves.js文件 注意geometry.setAttribute和geometry.addAttribute和在不同…

【腾讯地图】【微信小程序】地图选点

【相关文章】 【腾讯地图】【微信小程序】地图选点 【腾讯地图】【微信小程序】路线规划 【腾讯地图】【微信小程序】城市记录&#xff08;基于地图选点入门版&#xff09; 【效果展示】 【官方文档】 微信小程序插件-地图选点插件 【完善流程】 当前操作和官方文档操作有部…

Attacking Fake News Detectors via Manipulating News Social Engagement(2023 WWW)

Attacking Fake News Detectors via Manipulating News Social Engagement----《通过操纵新闻社交互动来攻击假新闻检测器》 摘要 在年轻一代中&#xff0c;获取新闻的主要来源之一是社交媒体。随着新闻在各种社交媒体平台上日益流行&#xff0c;虚假信息和毫无根据的言论的传…

【端到端可微2】链式法则,论文:Introduction to Gradient Descent and Backpropagation Algorithm

论文&#xff1a;Introduction to Gradient Descent and Backpropagation Algorithm 文章目录 0 前言1 链式法则定义作用 2 单神经元的正向传播forward propagation定义z 激活函数 3 损失函数定义 4 损失函数对权重张量的偏导数定义z对w求偏导l对z求偏导 5 多个神经元的正向传播…

企业软件的分类|app小程序网站定制开发

企业软件的分类|app小程序网站定制开发 企业软件是指为满足企业管理和运营需求而设计和开发的一类软件&#xff0c;它通常用于支持企业的各项业务活动和流程。根据其功能和应用领域的不同&#xff0c;可以将企业软件分为以下几类。 1. 企业资源计划&#xff08;ERP&#xff09…

Android性能优化 - 从SharedPreferences到DataStore

前言 对于android开发者们来说&#xff0c;SharedPreferences已经是一个老生常谈的话题了&#xff0c;之所以还在性能优化这个专栏中再次提到&#xff0c;是因为在实际项目中还是会有很多使用到的地方&#xff0c;同时它也有足够的“坑”&#xff0c;比如常见的主进程阻塞&…

k8s中批量处理Pod应用的Job和CronJob控制器介绍

目录 一.Job控制器 1.简介 2.Jobs较完整解释 3.示例演示 4.注意&#xff1a;如上例的话&#xff0c;执行“kubectl delete -f myJob.yaml”就可以将job删掉 二.CronJob&#xff08;简写为cj&#xff09; 1.简介 2.CronJob较完整解释 3.案例演示 4.如上例的话&#xf…

Tomcat的安装及其使用

一.下载安装 本文下载的是8.5版本的&#xff0c;下载链接&#xff1a;Apache Tomcat - Welcome! 切记解压缩的目录不要有中文存在。 二.启动Tomcat 在解压缩之后&#xff0c;会有很多文件存在&#xff0c;但是我们只需要在意两个文件&#xff01; webapps 目录 . web applica…

亚马逊产品如何在 TikTok 上推广?

对亚马逊卖家而言&#xff0c;TikTok是提升品牌社交媒体影响力的理想平台。该平台在过去一年中实现了飞速增长&#xff0c;使得营销变得既快捷又有趣&#xff0c;且高效。本文将详细阐述如何在TikTok推广亚马逊产品&#xff0c;并如何策划更强大的品牌营销活动。 各大品牌纷纷…

Anemone库的爬虫程序代码示例

以下是代码&#xff1a; ruby require anemone # 设置代理服务器 Anemone.proxies { http > "", https > "" } # 定义爬取的URL url # 使用Anemone进行爬取 Anemone.crawl(url) do |page| # 使用正则表达式找出所有的视频链接 video_…

Chrome显示分享按钮

分享按钮不见了&#xff01; Chrome://flags Chrome Refresh 2023 Disabled 左上角的标签搜索会到右上角。

Git - cherry-pick

文章目录 前言git资源 前言 本地 Git 仓库有两个分支&#xff0c;分别为 main 和 dev&#xff0c;dev 是 main 在 hash 为 a2 的时候创建的开发分支&#xff1a; 现在需要将 dev 分支中 hash 为 b1 的 commit 单独合并到分支 main 去&#xff1a; 这种将 dev 中部分特定 commi…

Windows系统如何远程控制Realme手机?

realme使用的是realme UI系统。realme UI是realme研发的操作系统&#xff1b;realme UI 1.0基于安卓10系统&#xff0c;realme UI 2.0基于安卓11系统&#xff0c;realme UI 3.0基于安卓12系统。 对于安卓4.0及以上系统的手机&#xff0c;都可以通过软件AirDroid实现远程控制。 …

JavaScript黑科技:简洁有用的一行代码,让你的开发效率飙升!

说在前面 在这篇技术博客中&#xff0c;我们将向你介绍一些令人惊叹的JavaScript黑科技&#xff0c;这些只需一行代码就能实现的简洁而有用的功能&#xff0c;将极大地提升你的开发效率。无论是优化代码、增加交互性&#xff0c;还是实现复杂的逻辑&#xff0c;这些代码片段将成…

echarts图表显示不全

图表显示是显示了&#xff0c;但是没有展示全部&#xff0c;一看控制台div的高度只有1px了&#xff0c;手动修改高度也只是拉伸图表&#xff0c;并没有按规定的尺寸展示 随之开始思考为什么呢 ? ? ? 因为 Echarts 的依赖是惰性的&#xff0c;需要手动设置resize&#xff0…

Android textView 显示: STRING_TOO_LARGE

默认情况下&#xff0c;TextView只能显示大约32K的字符。如果你的字符串超过这个限制&#xff0c;你将收到一个错误&#xff1a;“String too large”。 <string content" ...."/>问题点是&#xff1a;getResource().getString(R.string.content) 得到的是&am…

TableAgent:首个国产可私有部署的企业级Code Interpreter

TableAgent公测地址&#xff1a;https://tableagent.DataCanvas.com 数字化时代&#xff0c;数据分析的重要性犹如空气般无处不在。商业数据分析是数字化管理、智能决策的基础&#xff0c;同时数据分析又是一个专业性极强的工作&#xff0c;描述性分析、诊断性分析、预测性分…