堆与堆排序

堆排序算法(图解详细流程) 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录堆排序基本介绍大顶堆举例说明小顶堆举例说明堆排序的基本思想堆排序步骤图解说明堆排序的基本思路总结 堆排序基本介绍 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏最好,平均时间复杂度均为O(nlogn),他也是不稳定排序 堆是具有以下性质的完全二叉树,每个节点的值都大于或等于其左右孩子节点的值,称为大顶堆,注意:没有要求节点的左孩子的值和右孩子的值的大小关系。 每个结点的值都小于或等于其左 阅读详情

参考

1 http://www.cnblogs.com/Anker/archive/2013/01/23/2873422.html

2 http://blog.youkuaiyun.com/morewindows/article/details/6709644/

3 http://blog.youkuaiyun.com/hguisu/article/details/7776068

堆排序的时间复杂度O(N*logN)的排序算法,先看下二叉堆的定义。

实际上就是一颗完全二叉树(Complete Binary Tree):在最后一层,并不是所有的节点都拥有子节点(其他层的节点拥有子节点--而且使用拥有两个子节点)。


二叉堆有两个特点

1 父节点的值大于等于(小于等于)字节点的值

2 每个节点的左子树和右每一个子节点都是一个(最大二叉堆或最小二叉堆)

当父节点的值总是大于等于子节点的值时,称作最大堆。当父节点的值总是小于等于子节点的值的时候,叫做最小堆。

           10个用数组表示节点描述建堆、堆排序过程。

建堆过程

       max-heappify 保持堆

       build-heap 构建堆

       heap-sort 堆排序

1 保持堆的算法源码

	/**
	 * 大顶堆,数组下标从0开始 
	 * @param a       数组
	 * @param length  待排序的元素个数
	 * @param i       当前节点--目标是要把这个节点调整成堆
	 */
	public static void adjustDown(int a[], int length, int i) {
		// 左右孩子
		for (;;) {
			int maxIndex = i;

			int leftIndex = i * 2 + 1;
			int rightIndex = i * 2 + 2;
			// 选择 a[i] 和 左右子节点的中最大的值
			if (leftIndex < length - 1 && a[leftIndex] > a[i]) {
				maxIndex = leftIndex;
			}

			if (rightIndex < length && a[rightIndex] > a[maxIndex]) {
				maxIndex = rightIndex;
			}

			// 当前节点 它的左孩子 右孩子,满足 最大堆
			if (maxIndex == i) {
				break;
			} else {
				// 交换 当前节点和孩子节点中最大的
				int temp = a[i];
				a[i] = a[maxIndex];
				a[maxIndex] = temp;
				i = maxIndex;
				continue;
			}
		}
	}

2 构建堆源码:

	/**
	 * 从下向上,从右到左第一个非叶子结点; 如果数组下标从0开始,start = (a.length - 2 ) / 2
	 * 
	 * @param a
	 */
	public static void buildHeap(int[] a) {
		for (int i = (a.length - 2) / 2; i >= 0; i--) {
			adjustDown(a, a.length, i);
		}
	}

3 堆排序源码:

	/**
	 * a[0] 是最大的元素,和最后一个元素交换位置,即a[length - 1],然后调整a[0] 成为最大堆
	 * 迭代N次,每一次调整时间复杂度最大OlogN,总的时间复杂度 O(NlogN)
	 * @param a 输入参数一个大顶堆
	 */
	public static void heapSort(int[] a) {
		for (int i = a.length; i > 0; i--) {
			int temp = a[0];
			a[0] = a[i - 1];
			a[i - 1] = temp;
			adjustDown(a, i - 1, 0);
		}
	}



       第一步 index=4 先找到最后一个有子结点的结点[max-1] / 2,先让他的两个子结点进行比较,找到大的值再和父结点的值进行比较。如果父结点的值小,则子结点和父结点进行交换,交换之后再往下比较。然后一步步递归上去,直到所在结点的位置是0号位置跳出。


       最后一个有子节点的节点的index等于4。先比较两个孩子节点中比较大的值,和a父节点比较。a[i]比较 a[4] < a[4*2 + 1]、a[4*2 + 2],交换父节点和子节点。

      第二步 index = 3,先比较左孩子,a[3] < a[3 * 2 + 1 ],12 < 32 , 交换。





       第三步 index = 2


堆排序是否是稳定的排序,为什么?

建堆与堆排序详细解析 1.堆的特性 堆有大根堆和小根堆,大根堆的子树,父结点比子结点都要大,小跟堆的子树,父节点都要比子结点小。 堆有这样的特性: n个元素的堆的高度是lognlognlogn,因为堆是一棵完全二叉树或者近似一棵完全二叉树。 堆中,如果父节点的index是n,那么这个结点的左右子结点的index 分别是2∗index+1​2*index+1​2∗index+1​和2∗index+2​2*index +... 阅读详情

相关推荐

堆和堆排序

1.什么是堆? 堆是一种特殊的二叉树,满足以下两点的我们称之为堆 1.必须是一棵完全二叉树,完全二叉树指树的元素在新增时满足从上到下,从左到右的新增顺序。 2.每个节点的值都大于等于或者小于等于左右子树的值。其中每个节点的值大于等于左右子树值的堆我们称之为大顶堆,而每个节点的值小于等于左右子树的值我们称之为小顶堆。 从上述图中可以看出图1和图2为大顶堆,而图3为小顶堆,而图4不是堆,原因是因为虽然是一棵二叉树,但是不是一颗...

知的IT成长之路 780

1015: 堆排序算法

2.arr[0]到arr[n-2]进行最大堆调整。已知一次最大堆调整得到arr[0](堆顶)最小。最后一个非叶子节点就是最后一个节点的父节点。1.堆顶和堆底arr[n-1]交换。进行一次最小堆调整(如视频)3.重复至剩下最后一个元素。

2302_79277225的博客 432

堆排序的两种建堆方式

本文我将深入讲解两种建堆方式 —— 自顶向下建堆和自底向上建堆,详细分析它们的原理、实现过程、时间复杂度、空间复杂度以及适用场景,并结合代码示例和图示,帮助读者全面掌握堆排序及其建堆方式。

1344

SWUST OJ 1015: 堆排序算法

1015: 堆排序算法 题目描述 编写程序堆排序算法。按照从小到大的顺序进行排序,测试数据为整数。 输入 第一行是待排序数据元素的个数; 第二行是待排序的数据元素。(提示:用小根堆) 输出 一趟堆排序的结果。 样例输入 10 50 36 41 19 23 4 20 18 12 22 样例输出 4 12 20 18 22 41 50 36 19 23 思路: 堆排序分类 ①大顶堆:每个节点的值都大于或者等于它的左右子节点的值。 大顶堆性质:arr[i] >= arr[2i + 1] &&

橙橙橙汁i的博客 2961

c语言实现堆排序算法 heapsort

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 堆排序的平均时间复杂度为Ο(nlogn) 。 算法步骤: 创建一个堆H[0..n-1] 把堆首(最大值)和堆尾互换 3. 把堆的尺寸缩小1,并调用shift_down(0),目的是把新的数组顶端数据调整到相应位置 4. 重复步骤2,直到堆的尺寸为1

堆排序算法(严蔚敏数据结构)

根据严蔚敏数据结构书上的伪码实现的堆排序算法。用户输入随机数的个数,然后程序生成相应个数的随机数,同时进行堆排序,并输出排序后的结果。VC++6.0编译测试通过。

swust oj 1015: 堆排序算法

堆(Heap)是计算机科学中一类特殊的数据结。堆通常是一个可以被看作一棵完全二叉树的数组对象。可以理解为堆就是一颗用数组是实现的完全二叉树。

2301_79744389的博客 670

数据结构 堆排序 输出每一趟结果

描述 用函数实现堆排序,并输出每趟排序的结果 Input 第一行:键盘输入待排序关键的个数n 第二行:输入n个待排序关键字,用空格分隔数据 Output 第一行:初始建堆后的结果 其后各行输出交换堆顶元素并调整堆的结果,数据之间用一个空格分隔 Sample Input 10 5 4 8 0 9 3 2 6 7 1 Sample Output 9 7 8 6 4 3 2 5 0 1 8 7 3 6 4 1 2 5 0 9 7 6 3 5 4 1 2 0 8 9 6 5 3 0 4 1 2 7 8 9 5 4 3 0 2 1 6 7 8 9 4 2 3 0 1 5 6 7 8 9 3 2 1 0 4 5 6 7 8 9 2 0 1 3 4 5 6 7 8 9 1 0 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9

swust.oj1015: 堆排序算法

1015: 堆排序算法 题目描述 编写程序堆排序算法。按照从小到大的顺序进行排序,测试数据为整数。 输入 第一行是待排序数据元素的个数; 第二行是待排序的数据元素。(提示:用小根堆) 输出 一趟堆排序的结果。 样例输入 10 50 36 41 19 23 4 20 18 12 22 样例输出 4 12 20 18 22 41 50 36 19 23 #include<stdio.h> void swap(int a[],int max,int i) { int temp=a[i]; a[i

xiaodaitongxue的博客 1632

ICCompiler II实战:从NDM生成到APR流程的完整避坑指南

本文是一份针对ICCompiler II(ICC II)后端物理实现流程的实战避坑指南。文章详细解析了从NDM库生成、设计初始化、布局规划到时钟树综合与布线的完整APR流程,重点分享了各环节的常见陷阱、精细化配置命令与调试经验,旨在帮助工程师高效达成PPA目标,确保设计一次成功。

p4q5r6s7t的博客 531

永磁同步电机ADRC控制策略优化:从理论到Simulink仿真实践

本文深入探讨了永磁同步电机自抗扰控制(ADRC)策略的优化与实践。针对传统PID在动态响应、抗扰及噪声抑制方面的不足,详细解析了ADRC三大核心组件——跟踪微分器(TD)、扩张状态观测器(ESO)与非线性状态误差反馈(NLSEF)的工作原理。通过手把手的Simulink仿真教程,展示了从算法编写、模型搭建到参数整定的完整流程,并进阶实现了位置-速度双环ADRC协同控制,为高性能电机伺服系统设计提供了从理论到实践的清晰指南。

root9的博客 412

堆及其堆排序

堆及堆排序

m0_67768006的博客 1845

ubuntu通过qemu安装银河麒麟V10_Arm_v8 (kylin_v10_飞腾/鲲鹏版)

一、windows下安装vmware虚拟机 二、ubuntu下载地址 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/20.04/ubuntu-20.04.3-live-server-amd64.iso 三、vmware中新建虚拟机,并使用ubuntu-20.04.3-live-server-amd64.iso作为启用盘 。。。在虚拟机中安装ubuntu(略) 四、配置ssh(如果ssh登录不上时配置) 修改openssh的配置 vi /etc/s

u010533742的博客 8703

堆(建堆算法,堆排序)

堆就是完全二叉树,而且是一种特殊的完全二叉树它需要满足每一个父节点都大于子节点,称为大堆或每一个父节点都小于子节点,称为小堆。而对兄弟节点之间的大小关系并没有要求(为此它并不是有序的)。

2302_80105876的博客 2829

告别License烦恼:手把手教你用VS Code+Cppcheck搭建免费的MISRA-C代码检查环境

本文详细介绍了如何使用VS Code和开源工具Cppcheck搭建免费的MISRA-C代码检查环境,帮助开发者规避商业工具的高额License费用。通过四步环境搭建和实战技巧,实现高效的代码静态检查,提升嵌入式开发的安全性和可靠性。

weixin_42523326的博客 247

2025华为杯第二十二届中国研究生数学建模竞赛D题:低空湍流监测及最优航路规划 - 完整解题分析+完整MATLAB源码!(上篇)

🎓 本文收录于 《滚雪球学数学建模》专栏,本专栏专注于从零基础出发,带你循序渐进掌握数学建模的核心方法与思维路径。通过“滚雪球式”学习法,从最简单的生活化案例到经典建模工具,再到省赛、国赛真题实战演练,逐步积累知识与技能,帮助你搭建完整的建模体系。无论你是刚接触建模的新生,还是希望提升科研与竞赛能力的学者与工程师,本专栏都将为你提供一条清晰、高效、可实操的建模成长路线,助力你快速进阶,突破难点,迈向数学建模竞赛与实际应用的更高峰 🚀!

**My Coding Family** 2585

【数据结构】堆的实现以及建堆算法和堆排序

哈喽,各位小伙伴大家好!上期给大家讲了树,二叉树以及堆。今天带着大家实现堆这个数据结构,以及堆排序。话不多说,咱们进入正题!向大厂冲锋!

大白的编程日记. 2018

Orange3实战教程:实例---文本分类

我们可以使用预测模型按作者、类型、情感等对文档进行分类。在此工作流中,我们根据文档的Aarne Thompshon Uther索引对文档进行归类,这是故事的主题定义。我们使用两个简单的学习器,Logistic回归和朴素贝叶斯,两者都可以在诺谟图中检查。然后再从可视化分类中添加列线图组件,观察哪些词对逻辑回归最重要。也可以尝试使用在朴素贝叶斯模型上,并编辑连线属性。再从模型中添加朴素贝叶斯模型,以尝试不同的学习器。

err2008的专栏 385

什么是堆以及堆排序原理

1.什么是堆? 答:堆是一种特殊的完全二叉树 问:什么是完全二叉树? 答:完全二叉树是二叉树的一种 问:什么是二叉树? 答:二叉树是树的一种 问:什么是树? 答:enmmmm,下面让我们来简单从头捋一遍,最后就知道什么是堆,以及堆排序是如何实现的了 树:树是不包含回路的连通无向图(任意的两个节点仅有唯一的一条路径连通,在一棵树中加一条边会构成图) 二叉树:是一种特殊的树,只要不为...

MaxineZhou的博客 3626

置顶必读(1) |《YOLOv8实战:从入门到深度优化》专栏导读,带你一文了解本专栏!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏,该专栏专注于分享我在YOLOv8目标检测模型中的实战经验,涵盖从入门基础到深度优化的全方位解决方案。无论你是计算机视觉的新手,还是具有多年深度学习经验的专家,本专栏都将为你提供高效、可复现的技术方案,助你掌握YOLOv8的核心技术,提升目标检测性能,突破瓶颈,优化模型,并加速项目开发🚀!

**My Coding Family** 14万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【数据结构】堆与堆排序

前言本篇博客我们来仔细说一下二叉树顺序存储的堆的结构,我们来看看堆到底如何实现,以及所谓的堆排序到底是什么若有问题 评论区见📝。

m0_74091744的博客 1090

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

堆的应用——堆排序

堆排序的实现,堆排序的复杂度分析。

m0_73693552的博客 1008

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

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

数据结构——堆,堆排序

我们都知道内存分布中的出来的空间都在堆区上。和有一个名字很相近的数据结构——,虽然名称相近,但两者是完全不同的东西。因为十大排序算法中有一个,所以从头开始了解下这个数据结构, 终学习下。

qq_41596730的博客 1375
上一篇: java8 特性例子 Map 新增方法
下一篇: 整理一下算法和数据结构
arkblue
博客等级 码龄18年 188粉丝 254原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值