堆排序传入两个参数arr 以及当前arr截取的需要排序的长度n
首先是进行建堆,第二步将末尾结点替换根结点,对长度截取数n减去1再进行建堆
代码如下:

function heapify(arr,n,i){//arr数组 n表示当前堆大小也就是arr截取的长度 i表示当前维护的三角堆顶下标let left = i * 2 + 1;let right = i * 2 + 2;let maxindex = i;if(left<n&&arr[maxindex]<arr[left]){maxindex = left;} if(right<n&&arr[maxindex]<arr[right]){maxindex = right;}if(i!=maxindex){let temp = arr[i];arr[i] = arr[maxindex];arr[maxindex] = temp;heapify(arr,n,maxindex);//交换完成后 maxindex所在位置的堆结构被破坏 所以对该堆递归}
}function heapSort(arr,n){//建堆for(let i=Math.floor(n/2-1);i>=0;i--){//n/2-1也就是找到末尾节点的父节点下标,因为n代表总长度,末尾下标为n-1 对应的父节点下标为(n-1-1)/2heapify(arr,n,i);}//将堆顶和最后一个元素位置交换,并将其拆出来for(let i = n-1;i>=0;i--){let temp = arr[i];arr[i] = arr[0];arr[0] = temp;heapify(arr,i,0);//将最后一个元素排除并建堆}
}

时间复杂度计算分析:
建堆时间复杂度(O(n)):
设数组长度为n,层数为h(为了方便理解,h从1计算)
假设是一个满二叉树,则3层就有7个节点,4层有11个…所以n = 2^h - 1
从最底部分析,(第一层1个第二层2个第三层4个第h层2^(h-1)个)
倒数第1层节点的父节点最多下调1次,倒数第1层共有2^(h-1)个节点
倒数第2层节点的父节点最多下调2次,倒数第2层共有2^(h-2)个节点

倒数第h-1层(第2层)节点的父节点最多下调h-1次,倒数第h-1层共有2个节点
所以从倒数第一层开始计算

t = 1 * 2^(h-1) + 2 * 2^(h-2) + 3 * 2^(h-3)…+ (h-1) * 2^1

由公式可看出,下调次数就是当前节点所在层数能够下探的层数。
假设4层的满二叉树,则对于第3层,还有1层下探空间,所以才说第4层的父节点(第3层)最多下调1次
所以第2层的父节点(根节点)最多下调h-1次
每层的计算为:最大下调次数 * 当前层节点个数
总结下来每层(从第2层开始算)的计算公式(假设当前第i层(i从1计算),总层数h)为 (h-i) * 2^(i-1)
现在需要t和h的关系
通过高中数学计算2t-t = 2^1 + 2^2 + 2^3 + … + 2^(i-1) + (h-i)*2^i - (h-1) * 2 = 2^i -2i
又因为总节点数n = 2^i - 1 所以i = log(n+1)
所以t = 2^log(n+1) - 2log(n+1) 忽略掉后者,t = n + 1
所以建堆时间复杂度O(n)

交换尾结点与根节点时间复杂度(O(nlogn))
和建堆的思路差不多,交换节点为O(1)交换n次,所以遍历消耗时间O(n),最坏情况下,对n-1个节点建堆的过程中,耗时为O(logn),所以耗时为n*log(n)

因此总耗时为O(n) + O(nlogn),考虑n>=2时,logn比1大,所以最终取时间复杂度为O(nlogn)

上述进行的计算在思路上参考了众多其他文章,思路上大同小异,若有误希望大家指出。

堆排序时间复杂度计算相关推荐

  1. Java基础-时间复杂度计算方式

    Java基础-时间复杂度计算方式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   时间复杂度通常是衡量算法的优劣的,衡量算法的时间严格来讲是很难衡量的,由于不同的机器性能不用环境 ...

  2. 堆排序时间复杂度_堆排序算法

    堆排序是指利用堆积树这种数据结构所设计的一种排序算法,它是选择排序的一种.可以利用数组的特点快速定位指定索引的元素.堆是一个优先级队列,对于大顶堆而言,堆顶元素的权值最大.将待排序的数组建堆,然后不断 ...

  3. 【算法数据结构Java实现】递归的简单剖析及时间复杂度计算

    1.理解 对于递归函数的理解,我觉得是比较重要的,因为很多大神能把递归函数用的惟妙惟肖,不光是他们的编程功力高深,更主要是能理解这个算法.比较直白的理解是,如果一个事件的逻辑可以表示成,f(x)=nf ...

  4. 【算法设计与分析】16 分治策略:快速排序(快速排序的时间复杂度计算)

    上一篇文章学习了:[算法设计与分析]15 分治策略:芯片测试 文章目录 1. 快速排序的基本思想 1.2 时间复杂度的计算 1.21 最坏情况时间复杂度计算 1.22 最好情况时间复杂度 1.23 平 ...

  5. 二分查找与时间复杂度计算分析

    二分查找: 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.   原理:假设表中元素 ...

  6. 时间复杂度计算--求两正整数最大公约数

    1.计算时间复杂度的基本流程 时间复杂度计算主要分为3个步骤: 先找出算法的基本操作 计算基本语句的执行次数的数量级 用O记号表示算法的时间性能 2. 求两数最大公约数 问题描述:求a, b两正整数的 ...

  7. 递归算法的时间复杂度计算

    递归算法的时间复杂度计算 递归时间复杂度的计算本质在于 递归次数*每次递归中的操作数 利用二叉树进行递归调用:O(logn),每次递归调用都是n/2.

  8. 高斯消元法的时间复杂度计算

    高斯消元法的时间复杂度计算 1.时间复杂度定义 2.几种常见复杂度执行效率的比较 3.时间复杂度的计算 4.高斯消元法的时间复杂度     算法的时间复杂度通常用来反映程序执行时间随输入规模增长而增长 ...

  9. 数据结构-时间复杂度计算示例

    数据结构-时间复杂度计算示例 1 数据结构-第一章-思维导图 2 时间复杂度-简介 3 时间复杂度-示例 3.1 时间复杂度-常用技巧 3.2 时间复杂度-示例 3.2.1 对数阶-时间复杂度计算 3 ...

  10. 时间复杂度计算及空间复杂度计算

    目录 1.算法效率 2.时间复杂度 3.空间复杂度 4.大O渐进表示法 5.常见时间复杂度 常见复杂度对比 oj练习 1.算法效率 算法效率分析分为两种:第一种是时间效率,第二种是空间效率.时间效率被 ...

最新文章

  1. linux攻击端口,Linux 常见攻击端口封杀表
  2. Ubuntu配置静态ip联网总结
  3. 中国致密气行业十四五前景分析及发展规划远景报告2022年版
  4. 【转:SAP学习篇】Fiori 的开发工具
  5. .net core读取配置文件
  6. 【牛客NOIP模拟】牛半仙的魔塔(增强版)【贪心】【并查集】
  7. qt怎么创建pri文件
  8. 从前序与中序遍历序列构造二叉树
  9. vue 1.0源代码重点难点分析
  10. Linux 命令(127)—— wget 命令
  11. 【图像处理】基于matlab GUI图像全局+局部美化【含Matlab源码 1461期】
  12. 嵌入式uml绘图工具_新的可嵌入制图工件
  13. C语言基础入门一(自学笔记)
  14. wincc服务器不能创建项目,wincc不能创建和打开项目
  15. 华为智慧屏鸿蒙系统深度评测,八个维度深度评测华为荣耀智慧屏
  16. jmeter性能测试各个方法介绍
  17. 普渡大学统计与计算机科学,普渡大学西拉法叶校区计算机科学与工程世界排名2017年最新排名第47(ARWU世界排名)...
  18. Tableau 日月环比同比
  19. 网络舆情数据分析系统技术方案
  20. 【元器件】2.无源晶振

热门文章

  1. C#实现简单小说阅读器
  2. 【历史上的今天】8 月 24 日:Windows 95问世;乔布斯辞任苹果 CEO 库克上台
  3. 熊猫烧香 - 核心源码
  4. 【CF55D】Beautiful Numbers-数位DP+优化
  5. QQ MSN 网页互动代码
  6. LCD1602显示程序理解
  7. 使用EasyExcel读取excel文件案例
  8. SpringBoot + iframe 前后端实现简单实用的下载文件、导出excel案例
  9. php变量覆盖,boblog任意变量覆盖漏洞
  10. 树莓派蜂鸣器python代码_[原创]初玩树莓派B 5控制蜂鸣器演奏乐曲