当前位置: 首页 > news >正文

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

二叉树的相关概念

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

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

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

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

    父亲的下标为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];//把左右孩子的最大值给stratstart = i;//start赋值为i}else{break;//如果越界,跳出循环}}arr[start] = tmp;//最后把原来start的值给补上
}void   HeapSort(int* arr, int len)//堆排序,O(nlogn),O(1),不稳定
{int i;//数组下标//第一次建立大根堆,从后往前,多次调整   //子是i,父是(子-1)/2for (i = (len - 1 - 1) / 2; i >= 0; i--)//O(n)数学证明//这个i是倒数第二层根的下标,比如说有11个数字,那么要从4下标开始调整{HeapAdjust(arr, i, len - 1);//第一次建立大根堆//这里的len-1,不影响调整,放大了不影响}//每次将0下标的数字和待排序的最后一个交换,然后再次调整  堆调整的时间复杂度是lognint  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)
稳定性:不稳定


本篇完!🍗

相关文章:

  • Vert.x 和 Spring Boot 是两种流行的 Java 框架的比较
  • Java AI 编程助手
  • 探索图像生成大模型Imagen:原理、比较与应用
  • Nginx的核心架构和设计原理
  • 大语言模型技术点总结
  • 二、词法分析,《编译原理》(本科教学版),第2版
  • 【C#】内存的使用和释放
  • AWS 管理控制台
  • 打造高质量软件架构 - 9大质量属性
  • [Linux]磁盘分区指令
  • 网络安全全方略
  • Python 爬虫 根据ID获得UP视频信息
  • Linux驱动开发(速记版)--并发与竞争
  • 【HDP】zookeeper未授权漏洞修复
  • debian 12配置固定ip
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 30秒的PHP代码片段(1)数组 - Array
  • Cookie 在前端中的实践
  • java概述
  • Median of Two Sorted Arrays
  • mockjs让前端开发独立于后端
  • Vue2.0 实现互斥
  • vue的全局变量和全局拦截请求器
  • 从零搭建Koa2 Server
  • 大整数乘法-表格法
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 近期前端发展计划
  • 前端自动化解决方案
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 一个项目push到多个远程Git仓库
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (day 12)JavaScript学习笔记(数组3)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (Java数据结构)ArrayList
  • (二)斐波那契Fabonacci函数
  • (分享)自己整理的一些简单awk实用语句
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (十三)Flink SQL
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .Net Core中Quartz的使用方法
  • .Net IOC框架入门之一 Unity
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .Net多线程Threading相关详解
  • .net和jar包windows服务部署
  • .NET命名规范和开发约定
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • //解决validator验证插件多个name相同只验证第一的问题
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • [Asp.net mvc]国际化
  • [ASP.NET MVC]如何定制Numeric属性/字段验证消息