十一、树结构的实际应用—堆排序

news2024/10/9 20:22:51

1、基本介绍

  • 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最好最坏平均时间复杂度均为O(n\log n) 。也不是稳定排序。
  • 堆是具有以下性质的完全二叉树:每个节点的值都大于或等于其左右孩子节点的值,称为大顶堆,注意:没有要求节点的左孩子的值和右孩子的值的大小关系。
  • 每个节点的值都小于或等于其左右孩子节点的值,称为小顶堆。

大顶堆举例说明:
在这里插入图片描述
小顶堆举例说明:
在这里插入图片描述一般升序排序采用大顶堆,降序排序采用小顶堆

2、堆排序的基本思想

  • 将待排序序列构造成一个大顶堆
  • 此时,整个序列的最大值就是堆顶的根节点
  • 将其与末尾元素进行交换,此时末尾就为最大值
  • 然后将剩余的 n-1 个元素重新构成一个堆,这样就会得到 n 个元素的次小值。如此反复进行,便能得到一个有序序列了

可以看到,在构建大顶堆的过程中,元素的个数逐渐减少,最后就得到一个有序序列了。

3、堆排序步骤图解

要求:给你一个数组 {4, 6, 8, 5, 9} ,要求使用堆排序,将数组升序排序

步骤一:构造初始堆。将给定的无序序列构造为一个大顶堆(一般升序排序采用大顶堆,降序排序采用小顶堆)
1)假定给定的无序序列结构如下:
在这里插入图片描述
2)此时我们从最后一个非叶子节点开始(叶节点不用调整,第一个非叶子节点在数组中的索引是:arr.length/2-1=5/2-1=1,也就是下面的6节点),从左至右,从下至上进行调整
在这里插入图片描述
3)找到第二个非叶子节点4,由于 [4, 9, 8] 中 9 最大,所以 4 和 9 交换
在这里插入图片描述
4)这时,交换导致了子根 [4, 5, 6] 结构混乱,继续调整, [4, 5, 6] 中,6最大,交换 4 和 6
在这里插入图片描述
此时,我们就将一个无序序列构造成了一个大顶堆

步骤二:将堆顶元素与末尾元素进行交换,使末尾元素最大,然后继续调整堆,再将堆顶元素与末尾元素交换,得到第二大元素,如此反复进行交换、重建、交换。
1)将堆顶元素 9 和末尾元素 4 进行交换
在这里插入图片描述
2)重新调整结构,使其继续满足堆定义
在这里插入图片描述
3)再将堆顶元素 8 与末尾元素 5 进行交换,得到第二大元素 8
在这里插入图片描述
4)后续过程,继续进行调整、交换,如此反复进行,最终使得整个序列有序
在这里插入图片描述
堆排序思路总结

  • 将无序序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆
  • 将堆顶元素与末尾元素交换,将最大元素“沉”到数组末端
  • 重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序

4、堆排序代码实现

public class HeapSortDemo {
	public static void main(String[] args) {
		//要求将数组进行升序排列----大顶锥
		int[] arr=new int[]{4,6,8,5,9};
		heapSort(arr);
		System.out.println("堆排序:" + Arrays.toString(arr));
	}

	public static void heapSort(int[] arr) {
		int temp = 0;
		//将无序序列建成一个大顶堆
		for (int i = arr.length/2-1; i >=0; i--) {
			adjustHeap(arr, i, arr.length);
		}
		
		for (int j = arr.length -1; j > 0; j--) {
			temp = arr[j];
			arr[j] = arr[0];
			arr[0] = temp;
			adjustHeap(arr, 0, j);//写0的目的是始终从顶部开始找
		}
	}

	/**
	 * 将对应的非叶子节点的树调整成大顶锥
	 * @param arr 待调整的数组
	 * @param i 表示非叶子节点在数组中的索引(是从最后一个非叶子节点开始的)
	 * @param length 表示对多少个元素进行调整,length在逐渐的减少
	 */
	public static void adjustHeap(int[] arr,int i,int length) {
		int temp = arr[i];
		
		for (int k = i * 2 + 1; k < length; k = k * 2 + 1) {
			if (k + 1< length && arr[k] < arr[k+1]) {//这个说明左子节点的值小于右子节点的值
				 k++;//在这种情况下让k指向右子节点(k为左子节点,k+1是右子节点)
			}
			if (arr[k] > temp) {//如果子节点大于父节点
				arr[i] = arr[k];//把较大的值,赋给当前节点
				i = k;//因为k没有完,下面可能还有左子树或者右子树
			}else {
				break;//如果是小于,直接停止即可,因为是从最后一个非叶子节点开始的,不用判断下面,下面就是有序的。
			}
			
		}
		 //当for循环结束后,我们已经将i为父节点的数的最大值放在了最顶上(局部)
        arr[i]=temp;//将temp赋值的放到调整后的位置
	}
}

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

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

相关文章

云音乐实现注册功能

1. 新建web项目 Shop_SM2. 复制Shop资源和相关代码&#xff0c;实现注册功能回顾当前配置下的加载顺序1.MyBatis的主配置文件mybatis-config.xml &#xff08;在根目录下&#xff09;和 工具类MyBatisUtil&#xff08;注意总配置文件的路径&#xff09;2.实体类&#xff08;Use…

docker篇---pycharm连接docker,使用docker环境

pycharm连接docker&#xff0c;使用docker环境一、生成镜像和容器1.1 创建容器&#xff0c;需要加端口映射1.2 进入容器1.3 设置root密码&#xff0c;后续登录会用到1.4 修改配置文件1.5 重启ssh服务1.5 本机连接ssh二、pycharm连接docker2.1 允许远程客户端连接2.2 pycharm配置…

线程互斥与同步--Linux

文章目录线程互斥的概念与意义互斥的原理--原子性关于售票模拟的互斥应用死锁问题线程同步的概念与意义条件变量实现同步生产者消费者模型--互斥与同步基于阻塞队列的生产者消费者模型基于环形队列的生产者消费者模型POSIX信号量线程池线程安全下的单例模式总结线程互斥的概念与…

OMS标准 第二卷 主要通讯

版本4.1.2/2016-12-16 发布 1 引言 1.1 概述 本部分描述了从设备&#xff08;仪表或执行器或断路器&#xff09;和&#xff08;固定的&#xff0c;通常由市电供电的&#xff09;主设备&#xff08;网关或其他通信单元&#xff09;之间有线和无线通信的最低开放式计量系统要…

1. Mybatis 入门

文章目录1. Mybatis 简介2. Mybatis 快速入门3. 使用 idea 写 SQL4. Mapper 代理开发5. MyBatis 核心配置文件1. Mybatis 简介 MyBatis 是一款优秀的持久层框架&#xff0c;用于简化 JDBC 开发。 官方文档&#xff1a;https://mybatis.org/mybatis-3/zh/index.html 持久层&am…

【自学Docker】Docker cp命令

Docker cp命令 大纲 docker cp命令教程 docker cp 命令用于在本地文件系统与 Dokcer容器 之间复制文件或者文件夹。该命令后面的 CONTAINER 可以是容器Id&#xff0c;或者是容器名。 docker cp命令语法 从容器复制到宿主机 haicoder(www.haicoder.net)# docker cp [OPTION…

第57篇-某日头条signature参数分析【2023-02-01】

声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、网站分析三、signature参数四、完整代码一、前言 今天来看一下新闻网站,分析一下参数 二、网站分析 网…

WebDAV之葫芦儿·派盘+一叶日记

一叶日记 支持WebDAV方式连接葫芦儿派盘。 推荐一款操作方便、界面简洁,记录生活点滴与心情,具有诗情画意的日记软件。 一叶日记是一款记录日记的手机软件,在这款软件中它里面有着各种不同的工具,可以方便用户去随时随地的记录日记,同时里面还有着各种不同的主题背景&…

补充:论Unity_InputSystemPacakage如何使用

图1补充一下默认特殊值如何设定&#xff0c;点击ProjectingSettings——InputSystemPacakage——Create Settings Asset 即可设置默认特殊值&#xff0c;或者点击图1中的Open input settings也可以打开此界面。 创建后会在Project窗口出现一个配置文件&#xff0c;不需要时删除…

你说反射有点难追,我觉得应该知难而退。

文章目录问题源码解析溯源问题解决方案第一种&#xff1a;第二种&#xff1a;第三种&#xff1a;问题 今天小伙伴遇到一个问题&#xff0c;有关于反射的&#xff0c;写个demo&#xff0c;大家看一下。 如上&#xff0c;运行之后会报错&#xff1a;出现了非法参数。 Exception…

深度学习论文: YOLOv6 v3.0: A Full-Scale Reloading及其PyTorch实现

深度学习论文: YOLOv6 v3.0: A Full-Scale Reloading及其PyTorch实现 YOLOv6 v3.0: A Full-Scale Reloading PDF: https://arxiv.org/pdf/2301.05586.pdf PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: https://github.com/shanglianlm0525/PyTorch…

2023年IB考试该如何备考?

IB课程考试时间 考试时间&#xff1a;IBO官方近期公布了2023年的考试时间与计划&#xff0c;中国学生IB考试时间定在2023.5.1至5.19。 在世界各地&#xff0c;学生在IB体系中均按照相同的教学大纲进行&#xff0c;并且于毕业时参加全球统一考试。一年两次&#xff08;北半球于5…

拉伯证券|北向资金1月净买入超1400亿,啥信号?

2023年1月份&#xff0c;电视剧《狂飙》热播&#xff0c;被视为A股投资“风向标”的北向资金也敞开“狂飙”态势&#xff0c;月内五次净买入额超百亿&#xff0c;1月30日单日净买入额更是创2021年12月以来新高。 单月净买入超1400亿&#xff0c;刷新纪录&#xff01; 北向资金…

Ventoy安装教程

目录Ventoy五大优势Ventoy安装教程其他链接Ventoy是一款国人开发的新一代多ISO启动引导程序&#xff0c;用户只需要将所需的ISO镜像文件拷贝至优盘中即可在Ventoy界面中选择自己想要的ISO镜像文件。 Ventoy五大优势 广泛兼容&#xff1a;支持包括Windows 10、Windows 8.1、Wind…

【哈希表】leetcode15. 三数之和(C/C++/Java/Python/Js)--梦破碎的地方

leetcode15. 三数之和--梦破碎的地方1 题目2 思路2.1 哈希解法--含代码2.2 双指针2.3 去重逻辑的思考2.3.1 a的去重2.3.2 b与c的去重3 代码--双指针法3.1 C版本3.2 C版本3.3 Java版本3.4 Python3版本3.5 JavaScript版本4 总结用哈希表解决了两数之和 &#xff0c;那么三数之和呢…

[Lua实战]Skynet-2.如何启动(Win10-WSL环境Ubuntu18.04)[开箱可用]

Skynet-2.如何启动Win10-WSL环境Ubuntu18.04接上文,在linux运行skynet1.WIN10-WSL1.1 用Microsoft Store安装WSL(会遇到商店下载失败等问题...)1.1.1控制面板支持Linux配置1.1.2Microsoft Store 找到 Ubuntu18.041.1.3如果遇到安装问题如图请直接跳到1.21.2 使用PowerShell工具…

概论_第7章_参数估计_点估计之极大似然估计__性质

一 性质 极大似然估计 有一个简单有用的性质&#xff1a; 如果 θ^\hat\thetaθ^ 是 θ\thetaθ的极大似然估计&#xff0c; 则对任一 θ\thetaθ的函数g(θ)g(\theta)g(θ), 其极大似然估计为 g(θ^)g(\hat\theta)g(θ^) . 该性质称为极大似然估计的不变性&#xff0c;它使…

项目代码版本控制与维护

一、版本命名规则 1.1 需求开发分支命名规则 格式&#xff1a;dev_v版本号_需求名称 案例&#xff1a;dev_v01.31_TX202301141 dev_v01.31_数字产品平台订单查询优化 1.2 测试环境发布分支命名规则 格式&#xff1a;uat_deploy 1.3 预上环境分支命名规则 格式&#xff1a…

操作系统权限提升(六)之系统错误配置-不安全的服务提权

系列文章 操作系统权限提升(一)之操作系统权限介绍 操作系统权限提升(二)之常见提权的环境介绍 操作系统权限提升(三)之Windows系统内核溢出漏洞提权 操作系统权限提升(四)之系统错误配置-Tusted Service Paths提权 操作系统权限提升(五)之系统错误配置-PATH环境变量提权 注&…

九种查找算法-B树/B+树

B树/B树 在计算机科学中&#xff0c;B树&#xff08;B-tree&#xff09;是一种树状数据结构&#xff0c;它能够存储数据、对其进行排序并允许以O(log n)的时间复杂度运行进行查找、顺序读取、插入和删除的数据结构。B树&#xff0c;概括来说是一个节点可以拥有多于2个子节点的二…