[建堆堆排序的时间复杂度推导]向上建堆向下建堆堆排序的时间复杂度分析推导

💖💖💖欢迎来到我的博客,我是anmory💖💖💖
又和大家见面了
欢迎来到动画详解数据结构系列
作为一个程序员你不能不掌握的知识
先来自我推荐一波
个人网站欢迎访问以及捐款
推荐阅读
如何低成本搭建个人网站
专栏:动画详解leetcode算法题
C语言知识
玉桂狗听音乐

前导知识:求二叉树的节点个数

满二叉树的节点个数

对于一个满二叉树,每一层都满足等比数列,所以其节点个数总和我们可以使用等比数列求和公式来计算
我们假设满二叉树的高度是 h h h,节点个数是 N N N
满二叉树的节点个数

因此,满二叉树的节点个数是 N = 2 h − 1 N = 2^h-1 N=2h1
满二叉树的高度是 h = l o g 2 ( N + 1 ) h = log_2(N+1) h=log2(N+1)

最后一层只有一个节点的二叉树的节点个数

最后一层仅有一个节点的二叉树
公式推导

这样的二叉树的节点个数为 N N N= 2^h-1
高度为 h = l o g 2 N h=log_2N h=log2N


向下建堆的时间复杂度推导

向下建堆代码

// 向下调整函数
// n是指堆中有效元素的数量, parent是指堆顶的元素
// 需要比较子节点哪个大哪个小
void AdjustDown(HPDataType* a, int n,int parent)
{// 先假设左孩子大int child = parent * 2 + 1;while (child < n)// 当child>=n时就说明child已经到达叶子节点了{// 先找出左右孩子节点中大的那个if (child + 1 < n && a[child + 1] > a[child])// 说明假设错误,交换小的那个子节点{child++;}// 和父亲节点进行比较if (a[child] > a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}

向下建堆的时间复杂度推导

首先我们需要明白的是向下建堆是从倒数第一个非叶子节点开始建堆的
从何处开始建堆操作
知道了这个之后,我们就可以开始考虑最坏的建堆情况,也就是每一次都要向下调整
依旧假设高度为 h h h,我们可以算出每一层需要调整的次数
需要调整的次数
因此我们不难列出总的调整次数的公式
推导公式
那么,要想算出 T ( N ) T(N) T(N),我们就可以使用错位相减法来对其进行求和
错位相减法求和
因此,向下调整的总次数为:
结果
因此我们可以得到向下调整建堆的时间复杂度是
O ( N ) O(N) O(N)
除此之外,我们还可以发现
节点数多的调整的次数就少
节点数少的调整的次数就多


向上建堆的时间复杂度推导

向上建堆代码

// 向上调整函数
void AdjustUp(HPDataType* a, int child)
{int parent = (child - 1) / 2;while (child){// 大堆调整if (a[child] > a[parent]){Swap(&a[child], a[parent]);child = parent;parent = (child - 1) / 2;}// 若已经满足大堆,那么就跳出循环else{break;}}
}

向上建堆复杂度推导

向上调整建堆是从第二层开始的
从何处开始
因此我们可以算出调整的总次数
调整次数
结果
因此我们可以算出向上调整建堆的时间复杂度为
O ( N l o g N ) O(NlogN) O(NlogN)
除此之外我们可以发现
节点数少的层调整次数少
节点数多的层调整次数多


堆排序的时间复杂度推导

堆排序代码

// 对数组进行堆排序,需要建堆
void HeapSort(int* a, int n)
{// 降序,建小堆// 升序,建大堆for (int parent = (n-1-1)/2; parent > 0; parent--){AdjustDown(a, n, parent);}int end = n - 1;while (end > 0){Swap(&a[0], &a[end]);AdjustDown(a, end, 0);end--;}
}

堆排序的时间复杂度推导

我们可以发现,第一个for循环使用了向下调整建堆,其复杂度为 O ( N ) O(N) O(N)
第二个循环按理来说应该是 O ( N 2 ) O(N^2) O(N2)
但因为第二个循环并非是最坏的情况,所以我们认为其时间复杂度为 O ( N l o g N ) O(NlogN) O(NlogN)
因此,堆排序的时间复杂度就为
O ( N l o g N ) O(NlogN) O(NlogN)


💖💖💖非常感谢各位的支持💖💖💖
我们共同进步
本系列持续更新,关注我,带你了解更多数据结构知识
下期再见
玉桂狗听音乐

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

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

相关文章

ai电销机器人智能的原理和优势,如何帮助企业来提高销售效率的?

随着人工智能技术的发展&#xff0c;越来越多的企业开始选择使用ai智能外呼系统替代传统的人工拨打电话模式&#xff01;通过精准语音平台群呼潜在客户群体&#xff0c;精准筛选出意向客户并进行分类&#xff0c;实现无缝对接&#xff0c;节省80%人力成本&#xff0c;电销机器人…

hypermesh二次开发tcl脚本

hypermesh二次开发tcl脚本 1、tcl读csv文件,得到list,再转成二维数组2、tcl写csv文件3、hypermesh tcl根据读入的节点坐标建节点, 再显示节点号4、hypermesh tcl根据节点号建节点set5、hypermesh tcl根据节点set读取节点号&#xff0c;再根据节点号读取节点坐标&#xff0c;再将…

为什么别人写的SCI文章,容易接收?有技巧?

这篇文章是写给想发期刊文章的&#xff0c;但是导师没有时间去指导的人看的&#xff0c;无论是SCI还是EI、核心这类的,都适用。 想发文章&#xff0c;首先你得有文章&#xff01;以下从写论文的新手内心历程来解答。 paper怎么来呢&#xff1f;那肯定是找创新点&#xff0c;找…

Vue 父组件向子组件传递数据

1、在子组件中&#xff0c;你需要声明你期望从父组件接收哪些props。这可以通过props选项完成&#xff0c;可以是一个数组或对象形式&#xff1a; export default {props: [message]&#xff0c;props:{message:String }props: {message: String, // 类型检查count: {type: Nu…

vue3第三十三节(TS 之 computed watch)

vue3 组合是API 中我们经常使用的 监听函数 computed 和 watch使用 1、computed 里面添加类型 <script setup lang"ts"> import { ref, computed } from vue const age ref(18) // 定义一个Person 接口 interface Person {age: numbername: string } const…

深度学习之Pytorch框架垃圾分类智能识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着城市化进程的加快和人们环保意识的提高&#xff0c;垃圾分类已成为城市管理的重要一环。然而&am…

成本管控:如何利用 SOLIDWORKS Costing 高效估算成本?

现在全球材料短缺、生活成本上升以及能源价格上涨而导致的成本上升问题突显。 生产产品需要的成本以及如何让产品的成本下降就成为很多的企业越来越关注的问题。 SOLIDWORKS Costing是集成到 SOLIDWORKS Professional 和 Premium 中的一款允许用户和制造商估算产品生产成本的工…

判定字符是否唯一

题目链接 判定字符是否唯一 题目描述 注意点 0 < len(s) < 100s[i]仅包含小写字母 解答思路 首先想到的是使用数组存储字母是否出现过&#xff0c;如果多次出现则直接返回false为了不适用额外的数据结构&#xff0c;可以使用位运算判定字符是否唯一&#xff0c;思路…

第8章 原生MVC服务框架一

1 组件化重构 1.1 分而治之 分而治之(Divide and Conquer)是一种软件设计原则,它的核心思想是将大问题分解成小问题,以便更容易地解决。 具体而言,该原则建议将复杂的软件系统分解成更小、更易于管理的模块。每个模块都应该具有清晰的目标和职责,以便更容易理解、测试和…

Wpf 使用 Prism 实战开发Day22

客户端添加IDialogService 弹窗服务 在首页点击添加备忘录或待办事项按钮的时候&#xff0c;希望有一个弹窗&#xff0c;进行相对应的内容添加操作。 一.在Views文件夹中&#xff0c;再创建一个Dialog 文件夹&#xff0c;用于放置备忘录和待办事项的弹窗界面。 1.1 备忘录&…

Python 全栈体系【四阶】(五十二)

第五章 深度学习 十二、光学字符识别&#xff08;OCR&#xff09; 2. 文字检测技术 2.1 CTPN&#xff08;2016&#xff09; 2.1.1 概述 CTPN全称Detecting Text in Natural Image with Connectionist Text Proposal Network&#xff08;基于连接文本提议网络的自然图像文本…

是德科技 DSOS104A MSOS104A示波器

产品 带宽 通道数 最大存储器深度 DSOS104A 高清晰度示波器 1 GHz 4 个模拟通道 800 Mpts MSOS104A 高清晰度示波器 1 GHz 4 个模拟通道和 16 个数字通道 800 Mpts 商品介绍 …

JavaEE-文件IO1

文章目录 一、什么是文件IO?1.1 IO1.2 文件1.2.1 路径1.2.2 文件分类 二、使用Java针对文件系统进行操作 一、什么是文件IO? 1.1 IO IO分别代表Input和Output即输入和输出。比如我的电脑可以从网络上下载文件&#xff0c;也可以通过网络上传文件或者我把我的内存中的数据保…

Vue 离线地图实现

效果图&#xff1a; 一、获取市的地图数据 DataV.geoAtlas 获取市地图数据 点击地图缩放至想要的市区域&#xff0c;通过右侧的链接打开网址&#xff0c;复制json数据。 二、获取镇地图数据 选择你想要的镇数据&#xff0c;点击下载 选择级别&#xff08;清晰度&#xff09…

Plotly数据可视化宝典

一、引言 在数据驱动的时代,数据可视化已成为不可或缺的一部分。通过图形化的方式展示数据,我们能更直观地理解数据的内在规律和趋势。Plotly,作为一款强大的数据可视化工具,以其丰富的图表类型、交互性和灵活性,赢得了广大数据科学家的青睐。本宝典将深入解析Plotly的各…

mysql存储比特位

一、介绍 二、SQL CREATE TABLE bits_table (id INT PRIMARY KEY AUTO_INCREMENT,bit_value BIGINT UNSIGNED );-- 插入一个 8 位的 BIT 值 INSERT INTO bits_table (bit_value) VALUES (B10101010);-- 查询并格式化输出 SELECT id,bit_value,CONCAT(b, LPAD(BIN(bit_value),…

Midjourney绘画关键词参数汇总(二)

本文将继续介绍Midjourney绘画关键词参数的汇总&#xff0c;探索其在数字绘画中的应用和潜力。本文主要是提供与主题相关的关键词供大家参考学习。 大家感兴趣的话&#xff0c;可以在下列Midjourney中文版系统中体验&#xff1a;https://ai.easyaigx.com 一、日本漫画主题关键…

MGRE实验——路由配置

对134环回 ping一下发现都可以通 配置3&#xff0c;4同3 再注册 然后内网要互通&#xff0c;起rip 宣告1的左边和右边 对3 对4 当3&#xff0c;4之间要互通时&#xff0c;首先在1上 关闭之后&#xff0c;3就能学到4上的用户网段&#xff0c;4也能学到3 局域网要访问广域网一定…

大数据学习之 Hadoop部署

Hadoop部署 Linux桌面模式关闭 # 设置 systemctl set-default multi-user.target # 重启 reboot防火墙关闭 systemctl status firewalld systemctl stop firewalld # 关闭开机自启 systemctl disable firewalld配置Java环境 echo $JAVA_HOME java -version # Java配置 # 上传ja…

【贪心算法题目】

1. 柠檬水找零 这一个题目是一个比较简单的模拟算法&#xff0c;只需要根据手里的钱进行找零即可&#xff0c;对于贪心的这一点&#xff0c;主要是在20元钱找零的情况下&#xff0c;此时会出现两种情况&#xff1a;10 5 的组合 和 5 5 5 的组合&#xff0c;根据找零的特点&a…