排序--堆排序【图文详解】

news2024/11/17 7:22:29

二叉树的相关概念

  • 叶子:没有子节点的节点叫叶子节点

  • 大根堆:所有的父亲大于儿子

  • 小根堆:所有的儿子大于父亲

  • 父亲于儿子的的下标关系

    父亲的下标为i ,那么左孩子的下标为2*i+1,右孩子的下标为2i+2

    子的下标是i ,父的下标为(i-1)/2

构建大根堆的方法

  • 从最后一棵子树开始,从后往前调整;
  • 每次调整,从上往下; 调整为大根堆;

图解

在这里插入图片描述

完整代码

void  HeapAdjust(int* arr, int start, int end)//堆调整,从倒数第二层开始调整
{
	int  tmp = arr[start];//先把start的值保存下来,要不然丢失数据
	//先找左孩子,2*strat+1,
	for (int i = 2 * start + 1; i <= end; i = 2 * i + 1)
	{
		//把i定位为左右孩子的最大值下标
		if (i < end && arr[i] < arr[i + 1])//有右孩子,并且左孩子的值小于右孩子
		{
			i++;
		}//i一定是左右孩子的最大值
		//找到左右孩子的最大值后
		if (arr[i] > tmp)
		{
			arr[start] = arr[i];//把左右孩子的最大值给strat
			start = i;//start赋值为i
		}
		else
		{
			break;//如果越界,跳出循环
		}
	}
	arr[start] = tmp;//最后把原来start的值给补上
}

void   HeapSort(int* arr, int len)//堆排序,O(nlogn),O(1),不稳定
{
	int i;//数组下标
	//第一次建立大根堆,从后往前,多次调整   
	//子是i,父是(子-1)/2
	for (i = (len - 1 - 1) / 2; i >= 0; i--)//O(n)数学证明
	//这个i是倒数第二层根的下标,比如说有11个数字,那么要从4下标开始调整
	{
		HeapAdjust(arr, i, len - 1);//第一次建立大根堆
		//这里的len-1,不影响调整,放大了不影响

	}
	//每次将0下标的数字和待排序的最后一个交换,然后再次调整  堆调整的时间复杂度是logn
	int  tmp;//临时变量
	for (i = 0; i < len - 1; i++)  //O(nlogn)  11个数字交换10次    
	{
		//交换    
		tmp = arr[0];    
		arr[0] = arr[len - 1 - i];//len-1-i是因为调整好了的数字不要再动了    
		arr[len - 1 - i] = tmp;    

		//再次调整    
		HeapAdjust(arr, 0, len - 1 - i - 1);//堆调整    
		//len-1-i-1的解释:len-1-i是要交换的数字,交换完的数字不需要再参加调整    
	}
}

建立大根堆的时间复杂度:O(n) 堆调整的时间复杂度是O(logn)

时间复杂度:O(nlogn)
空间复杂度:O(1)
稳定性:不稳定


本篇完!🍗

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

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

相关文章

Fuxi:一款功能强大的跨平台渗透测试工具

关于Fuxi Fuxi是一款功能强大的跨平台渗透测试工具&#xff0c;该工具基于Python 3开发&#xff0c;支持在Linux、macOS和Windows操作系统上使用&#xff0c;具备良好的跨平台特性。在该工具的帮助下&#xff0c;广大研究人员可以轻松快速地执行渗透测试和安全研究任务。 工具…

SpringCloudEureka简介

背景 SpringCloudEureka是基于NetfliEureka做了二次封装&#xff0c;负责微服务架构的服务治理功能。 SpringCloud通过为Eureka增加SpringBoot风格的自动化配置&#xff0c;只需要简单的引入依赖和注解配置&#xff0c;就能让SpringBoot构建的微服务应用轻松和Eureka服务治理体…

SQL语言入门

一、SQL语言入门&#xff1a; 数据库管理人员&#xff08;DBA&#xff09;通过数据库管理系统&#xff08;DBMS&#xff09;可以对数据库&#xff08;DB&#xff09;中的数据进行操作 SQL是一种非过程化语言&#xff0c;只需提出“做什么”&#xff0c;而不需要指明“怎么做”…

11. LCEL:LangChain Expression Language

这篇文章覆盖了LCEL的理解和他是如何工作的。 LCEL(LangChain Expression Language)&#xff1a;是把一些有趣python概念抽象成一种格式&#xff0c;从而为构建LangChain组件链提供一种“简约”代码层。 LCEL在下面方面有着强大的支撑&#xff1a; 链的快速开发流式输出、异…

C++ 刷题 使用到的一些有用的容器和函数

优先队列 c优先队列priority_queue&#xff08;自定义比较函数&#xff09;_c优先队列自定义比较-CSDN博客 373. 查找和最小的 K 对数字 - 力扣&#xff08;LeetCode&#xff09; 官方题解&#xff1a; class Solution { public:vector<vector<int>> kSmallestP…

java 解析excel (本地资源)

在Java中解析Excel文件&#xff0c;可以使用Apache POI库。以下是一个简单的例子&#xff0c;展示如何使用Apache POI读取一个Excel文件&#xff08;假设为.xlsx格式&#xff09;的内容。 首先&#xff0c;确保你的项目中包含了Apache POI的依赖。如果你使用Maven&#xff0c;…

绝了,自从用了它,我每天能多摸鱼2小时!

大家好&#xff0c;我是可乐。 俗话说的好&#xff1a;“摸鱼一时爽&#xff0c;一直摸鱼一直爽”。 作为一个程序员&#xff0c;是否有过调试代码熬到深夜&#xff1f;是否有过找不到解决方案而挠秃头顶&#xff1f; 但现在你即将要解放了&#xff0c;用了这款工具——秘塔…

【PWN · HOO | HOF | Tcache pthread struct】[2024 · ByteCTF] ezheap

在学习了一段时间堆后&#xff0c;终于能较为从容、有思路地做题了 目录 前言 一、题目 二、总体思路 三、攻击过程调试 &#xff08;1&#xff09;House of Orange &#xff08;2&#xff09;House of Force tcache pthread struct attack 四、EXP 总结 前言 做完…

Maya没有Arnold材质球

MAYA 没有Arnold材质球_哔哩哔哩_bilibili

OJ在线评测系统 前端 完善题目提交服务 细讲异步前端请求与后端接口交互

题目提交服务完善 这则笔记是我们来梳理一下前后端逻辑 主要是我们的提交逻辑 先是看前端 按钮绑定的是这个异步请求 async 关键字表示这个函数内部会使用 await 来等待异步操作完成。 异步提交表单数据 const doSubmit async () > {// message.error("刷题机架构…

第二十九篇——用间篇:间谍的五种用法

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 间谍的用法&#xff0c;精准的说明了对应的边界&#xff1b;以及在什么场…

字节打印流字符打印流

打印流不能读&#xff0c;只能写 打印流 分类:打印流一般是指:PrintStream&#xff0c;PrintWriter两个类 特点1:打印流只操作文件目的地&#xff0c;不操作数据源 特点2:特有的写出方法可以实现&#xff0c;数据原样写出 特点3:特有的写出方法&#xff0c;可以实现自动刷新…

如何将二氧化碳“封”入海底?

什么&#xff1f;人类在收集空气&#xff1f;&#xff01;&#xff01; 收集的二氧化碳用来干什么&#xff1f;这活咋干&#xff1f; 近期了解到一则新闻&#xff1a; 不得不说人类的智慧真是令人感叹&#xff0c;我们确实在为地球的环保事业添砖加瓦&#xff0c;点点滴滴的努…

【前端必读】一、使用 Cursor 的基本功能全教程(使用与安装)

【前端必读】一、使用 Cursor 的基本功能全教程&#xff08;使用与安装&#xff09; 【前端必读】二、使用 Cursor 的基本功能全教程&#xff08;快捷键及其他功能&#xff09; 一、使用 Cursor 的基本功能教程&#xff08;使用与安装&#xff09; 这篇教程主要讲解了如何使用…

react的事件绑定

文章目录 基本示例使用箭头函数事件对象阻止默认行为绑定事件处理函数的上下文 在 React 中&#xff0c;事件绑定主要通过 JSX 属性来实现。事件处理函数被传递给相应的事件属性&#xff0c;例如 onClick、onChange 等。这些属性会被绑定到 HTML 元素上&#xff0c;并在事件发生…

shiro 在未登录时候获取 SecurityUtils.getSubject() 异常

一、错误描述 需求背景&#xff1a;新项目需要通过aop将请求日志打印出来&#xff0c;并且附上当前登录人的账号&#xff0c;系统认证使用 shiro 控制&#xff0c;想着直接通过 SecurityUtils.getSubject() 获取当前身份&#xff0c;但是很不幸的是&#xff0c;当用户没有登录…

低代码BPM业务流程:简化企业流程管理的利器

什么是低代码BPM&#xff1f; 低代码BPM结合了低代码开发平台与业务流程管理的理念&#xff0c;使企业能够以较少的编码工作&#xff0c;快速设计、实施和优化业务流程。低代码平台通常提供可视化的界面&#xff0c;用户可以通过拖放组件来构建应用&#xff0c;而无需深入掌握…

linux信号 | 学习信号三步走 | 全解析信号的产生方式

前言&#xff1a;本节内容是信号&#xff0c; 主要讲解的是信号的产生。信号的产生是我们学习信号的第二个阶段。 我们已经学习过第一个阶段——信号的概念与预备知识&#xff08;没有学过的友友可以查看我的前一篇文章&#xff09;。 以及我们还没有学习信号的第三个阶段——信…

【rust】 基于rust编写wasm,实现markdown转换为html文本

文章目录 背景转换预览核心代码前置依赖rustup换源cargo换源中科大 wasm-pack安装 背景 尝试用rust编写一款markdown转html的插件&#xff0c;通过wasm给html使用&#xff0c;不得不说体积挺小&#xff0c;约200K&#xff0c; 比go的wasm起步2MB看着舒服点。 不过go的配置和换…

Nginx基础详解3(nginx.conf核心代码讲解、常用命令解析、Nginx日志切割)

续Nginx基础详解2&#xff08;首页解析过程、进程模型、处理Web请求机制、nginx.conf语法结构&#xff09;-CSDN博客 目录 8.nginx.conf核心代码 8.1错误日志 8.1.1第一列&#xff1a; 8.1.2第二列&#xff1a; 8.1.3第三列&#xff1a; 8.2 #pid 8.3http模块&#xff…