Java学习手册:(数据结构与算法-排序)堆排序

【排序算法】堆排序原理及Java实现 1、基本思想堆是一种特殊的树形数据结构,其每个节点都有一个值,通常提到的堆都是指一颗完全二叉树,根结点的值小于(或大于)两个子节点的值,同时,根节点的两个子树也分别是一个堆。 堆排序就是利用堆(假设利用大顶堆)进行排序的方法。它的基本思想是,将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根节点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余 阅读详情

一、什么是堆?

堆是一种数据结构,可以把堆看成一棵完全二叉树,这棵完全二叉树满足:任何一个非叶结点的值都不大于(或不小于)其左右孩子结点的值。

堆分为小根堆和大根堆。对于一个小(大)根堆,它是具有如下特征的一棵完全二叉树:

1、若树根结点存在左孩子,则根结点的值小(大)于等于左孩子结点的值。

2、若树根结点存在右孩子,则根结点的值小(大)于等于右孩子结点的值。

3、以左、右孩子为根的子树又各是一个堆。

堆排序的过程主要需要解决两个问题:

①按堆定义建初堆;

②去掉最大值之后重建堆,得到次大值;

二、当堆顶元素改变时,如何重建堆?

1、首先将完全二叉树根结点中的记录移出,该记录为待调整记录,此时根结点相当于空结点。

2、从空结点的左右子树中选出一个关键字较小的记录,如果该记录的关键字小于待调整记录的关键字,则将该记录上移至空结点中。

3、此时,原来那个关键字较小的子结点相当于空结点。

4、重复上述移动过程,直到空结点左、右的关键字均不小于待调整记录的关键字,此时将待调整记录放入空结点即可。

5、上述调整方法相当于把待调整记录逐步向下“筛”的过程,所以一般称为“筛选法”。

三、如何由一个任意序列建初堆?

一个任意序列看成是对于的完全二叉树,由于叶子结点可以视为单元素的堆,因而可以反复利用“筛选法”,自底向上逐层把所有以非叶结点为根的子树调整为堆,直到将整个二叉树调整为堆。可以证明,最后一个非叶子结点位于n/2(向下取整)个元素,n为二叉树结点数目。因此,“筛选法”从第n/2(向下取整)个元素开始,逐层向上倒退,直到根结点。

四、如何利用堆进行排序?

1、将待排序记录按照堆的定义建初堆,并输出堆顶元素;

2、调整剩余的记录序列,利用“筛选法”将前n-i个元素重新筛选并建立一个新堆,再输出堆顶元素;

3、重复执行2进行n-1次筛选;

算法思想:

①构建堆;

②交换堆顶元素与最后一个元素位置;

package com.haobi;
/*
 * 堆排序(小根堆)
 */
public class HeapSort {
	//调整小根堆
	public static void adjustMinHeap(int[] array, int pos, int len) {//pos-起始位置;len-长度;
		int parent;
		int child;
		for(parent=array[pos];2*pos+1<=len;pos = child) {//!!!for循环最后一步: pos=child -> 将更新后的child位置赋值给pos 
			child = 2*pos+1;//左孩子结点位置
			if(child<len && array[child]>array[child+1]) {//如果左孩子大于右孩子
				child++;//自增,判断右孩子与父结点的大小
			}
			if(array[child]<parent) {//如果右孩子小于父结点
				array[pos] = array[child];//将右孩子结点的值赋给父节点,也就是该循环的起始结点
			}else {
				break;
			}
		}
		array[pos] = parent;//!!!将parent值赋给array[pos],如果有更改则array[pos]表示叶子结点
		
	}
	public static void MinHeapSort(int[] array) {
		int i;
		int len = array.length;
		for(i=len/2-1;i>=0;i--) {//从最后一个非叶子结点(位于n/2(向下取整)个元素)开始,向前调整
			adjustMinHeap(array,i,len-1);
		}
		for(i=len-1;i>=0;i--) {//调整(len-1)次
			int temp = array[0];//将堆的第一个元素(堆顶)取出存入temp
			array[0] = array[i];//将最后一个元素取出放入堆顶
			array[i] = temp;//将堆首元素放在数组的最后一个元素所在的位置
			adjustMinHeap(array,0,i-1);//递归(len-1)次
		}
		
	}
	public static void main(String[] args) {
		int[] array = {4,1,3,2,16,9,10,14,8,7};
		MinHeapSort(array);
		for(int i=0;i<array.length;i++) {
			//小根堆逆序输出的原因是:将最小的元素始终与未定序数组的最后一个元素交换,所以数组中存放的是逆序
			System.out.print(array[i]+" ");
		}
	}
}

程序输出结果如下:

16 14 10 9 8 7 4 3 2 1 

堆排序基础与实践:如何在Java中实现堆排序 堆排序(Heap Sort)是一种基于堆数据结构的排序算法。堆是一种特殊的完全二叉树,堆排序利用堆的性质通过一系列操作将数组元素按升序或降序排列。堆排序的时间复杂度为 O(n log n),是一种不稳定的排序算法,且其空间复杂度为 O(1),因此在某些场景下非常有用。 阅读详情

相关推荐

基于N32G003的PMBus从机协议栈设计与STM32F103模拟I2C主机通信实战

本文详细介绍了基于N32G003微控制器设计PMBus从机协议栈,并与STM32F103模拟I2C主机进行通信的实战方案。重点阐述了中断驱动架构、命令解析、CRC8优化及超时恢复机制,实现了在70kHz速率下稳定可靠的工业电源管理通信,适用于服务器电源、通信基站等成本敏感应用场景。

numpy6sculptor的博客 919

筛选法建立初始堆_面试必知必会|理解堆和堆排序

本文首发于:面试必知必会|理解堆和堆排序微信公众号:后端技术指南针持续输出干货 欢迎关注 惊喜直达!本文将阐述堆和堆排序的基本原理,通过本文将了解到以下内容:堆数据结构的定义堆的数组表示堆的调整函数堆排序实践1.堆的简介堆是计算机科学中的一种特别的树状数据结构。若是满足以下特性,即可称为堆:给定堆中任意节点P和C,若P是C的母节点,那么P的值会小于等于C的值。若母节点的值恒小于等于子节点的值,此堆...

weixin_39736007的博客 7775

Cursor3.0新界面使用说明

本文摘要:Cursor 3.x版本更新后,提供了两套主界面:Editor(类似VSCode的代码编辑器)和AgentsWindow(以AI智能体为中心的新界面)。Editor适合日常编码,AgentsWindow则支持并行运行多个AI任务、云端协作和多仓库管理。通过Ctrl+E可快速切换布局。文章详细介绍了AI聊天面板的操作技巧、四种工作模式(Agent/Plan/Ask/Debug)的区别,以及AgentsWindow的多任务管理功能。同时提供了Windows快捷键速查、中文化设置方法,并对比了新旧版本的

2501_90421497的博客 727

堆

一、堆的初始化 1、堆的概念 堆实际上是一种完全二叉树,堆可分为大堆和小堆。大堆就是左右孩子的值都小于其父节点的值,根节点的值最大;小堆就是左右孩子的值都小于其父节点的值,根节点的值最小。 2、建堆 第一步:先给出一个数组 第二步:根据该数组,将其构建成完全二叉树的结构 第三步:以这个完全二叉树为基础构造初始堆,从最后一个非叶子节点开始向上调整,这里以小堆为例 这里对以上调整过

LP9127的博客 1569

用Raspberry Pi Imager重装树莓派系统

这次在官网无意中看到他们出了一个Raspberry Pi Imager的工具,可以直接完成镜像烧录操作,于是就尝了个鲜。选择“编辑设置”按钮,会弹出具体的设置信息,有三个tab,第一个是General信息,包括用户名、密码、wifi和语言设置;后续的操作就和我当初第一次装树莓派系统的操作差不多,在此就不再赘述,有兴趣的朋友可以看我以前的博文。完成定制化设置后,点击“保存”按钮,软件回到前面的提示框,连续点击两个“是”,开始写入SD。第二个下拉框选择你要安装的OS,点击黄框所在的选项,可以挑选更多OS。

天飓的技术博客 1085

RiscV运行zephyr和Linux的方法

riscv基金会搞了一个网站,用于介绍如何使用riscv指令集进行开发。 对于运行zephyr和linux以及Qemu有非常大的帮助。 可以作为riscv开发的相关参考。 RISC-V - Getting Started Guide — RISC-V - Getting Started Guidehttps://risc-v-getting-started-guide.readthedocs.io/en/latest/index.html RISC-V - Getting Started Gu.

闲人的专栏 737

选择排序--简单选择排序,堆排序(大根堆,小根堆的建立,堆排序,插入删除元素)包含程序

选择排序--简单选择排序,堆排序(大根堆,小根堆的建立,堆排序,插入删除元素)包含程序

m0_75220252的博客 2225

高精度计算Π的值(C语言)

题目要求 限制使用双向链表作存储结构,请根据用户输入的一个整数(该整数表示精确到小数点后的位数,可能要求精确到小数点后500位),高精度计算PI值。可以利用反三角函数幂级展开式来进行计算。 输入5 输出3.14159 思路分析 反三角函数幂级展开式 由公式可以看出,只要计算出来每一个R(n)的值再相加取二倍就可以得到Π的值。 经过推算,要是令R(1)=2,只需要将每个R(n),相加即可。 因...

weixin_46251155的博客 8032

筛选法建立初始小根堆图解

筛选法建立初始小根堆

Senbonzakura_py的博客 9125

Oracle EBS GL日记账批“选定以过账”状态数据修复

日记账来源:应收账款。用户操作过账以后,自动提交请求“过账:单一分类账”一直运行中,该请求执行5,6个小时甚至10多个小时无法完成,导致“标准管理器”阻塞大量请求待定,“冲突解决管理器”的待定数量不断增加。系统管理员不得不把该请求强制取消,此时,日记账批的状态处于“选定以过账”(GL_JE_BATCHES.STATUS为S),如下图 检查此日记账批有3千多条日记账题头,由于日记账比较多,日记账的科目余额计算需要大量服务器资源和执行时间比较长。

陈显平的专栏-Oracle EBS 3245

运维系列【仅供参考】:RustDesk部署疑难解答

RustDesk部署疑难解答

weixin_54626591的博客 279

堆的简单操作

基础: 1. 堆是一个完全二叉树 2. 堆有两种, 一种叫小堆(小根堆, 最小堆),  一种叫大堆(大根堆, 最大堆). 3. 以小堆为例, 这个树的根节点是这个树中的最小的元素  对于任意一个子树来说, 子树的根节点, 小于左右孩子节点的值.

adorable_的博客 527

大模型在电力交易功率预测中的应用:短期,超短期,中长期的完整解决方案代码详解

本文介绍了基于大模型的电力交易功率预测系统,该系统覆盖超短期(15分钟-1小时)、短期(1-6小时)和中长期(1天-1月)三个时间尺度。文章详细阐述了数据准备与特征工程,包括多源数据集成和特征重要性分析。在模型构建方面,采用了Temporal Fusion Transformer (TFT)模型进行超短期预测,Informer模型进行短期预测,以及N-HiTS模型进行中长期预测。此外,文章还探讨了概率预测与风险分析,并介绍了模型部署与交易策略集成的实现。最后,文章总结了系统的贡献,并展望了未来发展方向,如市

专注AI大模型,软件混淆,授权 1264

数据结构与算法之堆排序

堆排序概述 代码实现 时间复杂度

努力让自己发光,对的人才能迎着光而来 1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【JavaSE与数据结构】排序算法之堆排序与归并排序

本篇文章带大家认识排序算法——堆排序与归并排序,堆排序在讲解堆和优先队列的时候已经将原理介绍了一点点,并使用优先级队列实现了堆排序,本文将使用建堆和向下调整的方式实现堆排序,每种排序算法都有一个核心,向下调整是堆排序的核心,而归并排序的核心就是合并两个有序的数组,实现代码语言为java。

未见花闻的博客 1490

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【数据结构与算法】——排序算法之堆排序

🎄:优快云的小伙伴们大家好,今天跟大家分享一个排序算法——堆排序。如果这篇文章对你有用,麻烦给我点个小赞以示鼓励吧🎄

秋雨绵绵 1368

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

排序算法:堆排序

目录 一、堆: 二、堆排序: 一、堆: 1、什么是堆: 堆是一种特殊的树,它满足需要满足两个条件: (1)堆是一种完全二叉树,也就是除了最后一层,其他层的节点个数都是满的,最后一个节点都靠左排列。 (2)堆中每一个节点的值都必须大于等于(或小于等于)其左右子节点的值。 对于每个节点的值都大于等于子树中每个节点值的堆,我们叫作“大顶堆”。对于每个节点的值都小于等于子树中每个节点值的堆,我们叫作“小顶堆”。 2、堆的实现: 用数组来存储完全二叉树是非常节省内存空间的,因为我们不需要存储左右子

qq_55624813的博客 1万+

Java实现堆排序算法详解及优化

同时,我们探讨了堆排序的优化方法,包括使用更小的辅助空间,以提高其性能。堆排序通过将数组构建成一个最大堆,然后重复地将堆顶元素与末尾元素交换,并缩小堆的范围,重新调整堆结构来实现排序。交换堆顶和末尾元素: 1, 5, 3, 4, 10。交换堆顶和末尾元素: 1, 4, 3, 5, 10。交换堆顶和末尾元素: 1, 3, 4, 5, 10。构建最大堆: 10, 5, 3, 4, 1。调整堆: 5, 4, 3, 1, 10。调整堆: 4, 1, 3, 5, 10。调整堆: 3, 1, 4, 5, 10。

捕风捉你 · 星桥API接入与大模型实战 1451

[算法沉淀记录] 排序算法 —— 堆排序

堆排序(Heap Sort)是一种基于比较的排序算法,它利用堆这种数据结构来实现排序。堆是一种特殊的完全二叉树,其中每个节点的值都必须大于或等于(最大堆)或小于或等于(最小堆)其子节点的值。堆是一个近似完全二叉树的数据结构,满足任一非叶子节点的值不小于(或不大于)其左右孩子节点的值。堆通常分为最大堆和最小堆:堆排序算法通过构建一个最大堆或最小堆,然后将堆顶元素(最大或最小值)与堆的最后一个元素交换,再将剩余的元素重新调整为最大堆或最小堆,如此反复,直到整个数组有序。堆排序是一种高效的排序算法、

莫寒技术人生 2198

Java学习手册:数据结构与算法汇总

数据结构与算法程序题汇总如下:(不断更新中) 1、PAT(Basic Level)Practise-----1001 2、Java学习手册:(数据结构与算法-链表)如何实现单链表的增删操作? 3、Java学习手册:(数据结构与算法-链表)如何实现单链表排序? 4、Java学习手册:(数据结构与算法-链表)如何从链表中删除重复元素? 5、Java学习手册:(数据结构与算法-链表)如何找出单链表中的倒...

浩比的专栏 3248

Java实现堆排序算法

堆排序算法 在本教程中,您将学习堆排序算法的工作原理。此外,您还将找到使用C,C ++,Java和Python进行堆排序的工作示例。 堆排序是计算机编程中一种流行且高效的排序算法。学习如何编写堆排序算法需要了解两种类型的数据结构-数组和树。 我们要排序的初始数字集存储在数组中,例如[10, 3, 76, 34, 23, 32],排序后,我们得到一个排序后的数组[3,10,23,32,34,76] 堆排序的工作原理是将数组的元素可视化为一种特殊的完整二叉树,称为堆。 前提条件是,..

allway2的博客 1719

Java 与排序算法(7):堆排序

堆排序是一种基于比较的排序算法,它的基本思想是将待排序的元素构建成一个堆,然后依次将堆顶元素取出,放到已排序的序列中,直到堆中所有元素都被取出,最终得到一个有序的序列。堆是一种特殊的树形数据结构,它满足以下两个条件:堆是一颗完全二叉树。堆中每个节点的值都大于等于(或小于等于)其左右子节点的值,这种性质称为堆的性质。堆排序的基本步骤如下:构建堆:将待排序的元素构建成一个堆,可以使用数组来表示堆,数组中下标为 i 的元素的左子节点下标为 2i+1,右子节点下标为 2i+2。

暗星涌动 2730

Java排序算法(五):堆排序

[算法说明] 堆排序是对简单选择排序的改进 简单选择排序是从n个记录中找出一个最小的记录,需要比较n-1次。但是这样的操作并没有把每一趟的比较结果保存下来,在后一趟的比较中,有许多比较在前一趟已经做过了,但由于前一趟排序时未保存这些比较结果,所以后一趟排序时又重复执行了这些比较操作,因而记录的比较次数较多。 堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆

技术人生 1万+

数据结构与算法:堆排序

网上看了下很多堆排序的介绍,有些介绍很容易懂,自己再结合书上介绍的,网上没有的,以自己的理解,就当做个笔记 文章目录概要概述堆排序几个重要的点构造初始堆图解堆排序图解代码实现(java)堆排序特点堆排序应用场景 概要 code语言:java、c 测试环境:win、java8 参考书籍:《数据结构与算法分析java语言描述》 原书第三版、《数据结构:使用C语言》、《算法导论》原书第三版 参考链...

maoyuanming0806的博客 1152

JAVA数据结构与算法之————堆排序

JAVA数据结构与算法之————堆排序 直接上代码: public class Heap { public void heapSort(int[] heap){ /*从最后一个叶子节点的父节点往前调整堆,直到根节点*/ for(int i = (heap.length - 1) / 2; i > 0; i--){ heapAdj...

qq_36007633的博客 569

死磕数据结构与算法(排序java)--堆排序。才疏学浅,如有错误,及时指正

排序算法。堆排序是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

qq_41497756的博客 1180
上一篇: Java学习手册:(数据结构与算法-排序)归并排序
下一篇: Java学习手册:多态的实现机制(重载和覆盖)
浩比浩比
博客等级 码龄12年 395粉丝 202原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值