一、代码实现

关于具体实现过程请点 https://blog.csdn.net/weixin_44324174/article/details/104183349
本片文章只讲堆排序时间复杂度的计算过程。

package com.westmo1.demo2;
import java.util.Arrays;
import java.util.Scanner;
public class MyDemo3 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("输入数据");int[] ints = new int[7];for (int i = 0; i < ints.length; i++) {int i1 = scanner.nextInt();ints[i]=i1;}int length=ints.length-1;int root=ints.length/2-1;for (int i = root; i >=0; i--) {BuildHeap(ints, length, i);}//取值,把根结点元素和最后一个元素交换for (int i = 0; i <ints.length; i++) {swap(ints,0,length);length--;BuildHeap(ints,length,0);}System.out.println(Arrays.toString(ints));}//建立大根堆public static void BuildHeap(int arr[],int length,int root){int leftcode=root*2+1;int rightcode=root*2+2;int max=root;if(leftcode<length&&arr[leftcode]>=arr[max]){max=leftcode;}if(rightcode<length&&arr[rightcode]>=arr[max]){max=rightcode;}if (max!=root) {swap(arr,max,root);//调整完之后,可能会影响到下面的子树,需再次调整BuildHeap(arr,length,max);}}private static void swap(int[] arr, int i, int j) {int t=arr[i];arr[i]=arr[j];arr[j]=t;}
}

二、时间复杂度的计算

注意:这里计算都是以完满二叉树进行计算的。

1、建堆

建堆的过程都是从倒数第二层最右边的节点开始,每个节点调整位置花费的时间复杂度是O(1),为了方便后面的计算,统计就说是执行1次;然后是倒数第三层,这一层每个节点也需要执行1次,但是因为调整后会影响到它的后面的节点,所以每个节点还需执行1次(这个次数取决于你的代码怎么写,非常关键),这里非常关键。

int max=root;
if(leftcode<length&&arr[leftcode]>=arr[max]){max=leftcode;
}if(rightcode<length&&arr[rightcode]>=arr[max]){max=rightcode;
}
if (max!=root) {swap(arr,max,root)//调整完之后,可能会影响到下面的子树,需再次调整BuildHeap(arr,length,max);
}

上面的代码是调整节点位置的过程,我们发现,这种代码调整之后的结果是:**父节点最后只和它的左孩子节点或右孩子节点的其中一个发生了交换,**所以倒数第三层每个节点的在调整位置的时候,每个节点只会影响到它的右子树或者左子树的结构中的一个,所以执行1次。如果这里的代码采用的是父节点先和左孩子结点比较交换然后再和右孩子节点比较交换的写法,那它最后时间复杂度计算出来的结果就是nlogn;我们是以最优的算法来计算的。
我们以三层结构的完满二叉树举例来推导一下计算公式

所以最后推导出来的公式就是:

S=[2^(k-1)+2^(k-1)*0]+[2^(k-2)+2^(k-2)*1]+[2^(k-3)+2^(k-3)*2]+......+[2^0+2^0*(k-1)]
化简后得:S=2^(k-1)*1+2^(k-2)*2+2^(k-3)*3+.......+2^0*k;S=2^0*k+2^1*(k-1)+......+2^(k-2)*2+2^(k-1)*1;   (1)
使用等比数列求和中的错位相减法,两边同乘以2,得:2S=2^1*k+2^2*(k-1)+......+2^(k-1)*2+2^k*1;      (2)
(2)式-(1)式可得:S=-2^0*k+2^1+2^2+2^3+.......+2^(k-1)+2^k;
使用等比数列求和公式可得:S=2^(k+1)-k-2;

所以建堆的总执行次数就是:S=2^(k+1)-k-2
完满二叉树的节点个数是2的整次幂减1,所以2^k-1=节点个数n,所以高度k=log(n+1);
把k带入S中可得:S=2^(log(n+1)+1)-log(n+1)-2,化简得S=2n-log(n+1);
所以建堆的时间复杂度为O(n);

2、取值后重新调整堆

取值每次取的都是堆顶元素,取完重新调整的次数都是k次,时间复杂度就是也就是logn,而循环要执行n次,所以取值后重新调整堆得时间复杂度就是O(nlogn);

综上所述,堆排序的时间复杂度就是O(n(logn+1))就是O(nlogn);

完全都是个人理解,网上搜了好多,自己都没看的太懂,后来自己摸索着搞了搞,哪里有问题还请指正。

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

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

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

  2. 排序算法之快速排序及其时间复杂度的计算

    快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分 ...

  3. 动画版RNN、LSTM和GRU计算过程

    公众号关注 "视学算法" 设为"星标",第一时间知晓最新干货~ 编辑 | Python遇见机器学习 地址 | https://zhuanlan.zhihu.co ...

  4. python计算小数点后有几位_数学提高小数除法竖式计算过程

    除数是小数时:先把除数变成整数,除数扩大到原来的多少倍,被除数也要扩大到原来的多少倍(即小数点也向右移动几位,位数不够的用0补),然后按照除数是整数的除法进行计算.计算小数除法,除到被除数的末尾仍有余 ...

  5. 交叉熵损失(Cross Entropy Loss)计算过程

    交叉熵损失(Cross Entropy Loss)计算过程_藏知阁-CSDN博客_交叉熵计算公式

  6. 衡量计算机的平均无故障时间6,平均无故障时间MTBF测试及计算过程

    <平均无故障时间MTBF测试及计算过程>由会员分享,可在线阅读,更多相关<平均无故障时间MTBF测试及计算过程(4页珍藏版)>请在人人文库网上搜索. 1.一.寿命估算模型常温下 ...

  7. 【计算理论】计算理论总结 ( 下推自动机计算过程 | 上下文无关文法 CFG 转为下推自动机 PDA ) ★★

    文章目录 一.下推自动机计算过程 二.上下文无关文法 CFG 转为下推自动机 PDA 流程 参考博客 : [计算理论]上下文无关语法 ( 语法组成 | 规则 | 语法 | 语法示例 | 约定的简写形式 ...

  8. 【计算理论】图灵机 ( 非确定性图灵机 | 非确定性图灵机指令分析 | 计算过程 | 非确定性指令出现多个分支 | 非确定性图灵机转为计算树 | 计算树 )

    文章目录 一.非确定性图灵机 二.非确定性图灵机 指令 三.非确定性图灵机 计算示例 初始状态 四.计算步骤 1 五.计算步骤 2 六.计算步骤 3 ( 出现非确定性分支 ) 七.计算步骤 3-1 ( ...

  9. 【计算理论】非确定性有限自动机 ( 计算过程 | 计算树 | 确定可接受字符串 | 设计非确定性有限自动机 | 空字符 )

    文章目录 一.非确定性自动机 计算过程 ( 计算树 ) 二.判定 非确定性自动机 接受的字符串 三.自动机 设计要求 四.非确定性有限自动机设计 五.非确定性有限自动机 与 确定性 有限自动机 比较 ...

  10. 举例说明信息熵、互信息的计算过程

    举例说明信息熵.互信息的计算过程_tangxianyu的博客-CSDN博客_互信息计算

最新文章

  1. ActiveMQ — 单节点 — 安装与配置
  2. 数据安全最佳实践案例库建设项目正式启动
  3. 通信系统之信道(四)
  4. C++ Primer 5th笔记(chap 19 特殊工具与技术)枚举类型
  5. 安装mysql5.15.7版本_YUM方法安装mysql5.7版本
  6. python自动化之正则
  7. [vue] vue开发过程中你有使用什么辅助工具吗?
  8. ORACLE10G导入11G导出的文件
  9. 编译安装MongoDB以及安装PHP的mongodb扩展
  10. 动态打字效果 html,html5 svg酷炫的打字动画特效
  11. 20190903每日一句
  12. 签到系统实验报告_实验报告评分标准
  13. android studio更改代码字体,Android Studio怎么改变代码字体大小?
  14. java基本数据类型转类对象
  15. android 投影pc,手机高清投影到PC方案
  16. 智能工厂具体的名词解释
  17. unity摄像机环绕物体旋转
  18. 骑士cms文件包含getshell复现
  19. 独立开发变现周刊(第41期):一个开源项目一个人每月收入8万美金
  20. 九龙证券|铁锂电池是什么?铁锂电池的工作原理和优点介绍

热门文章

  1. SQL Server 2005 无法连接服务器(error:10061)
  2. Windows右键菜单设置与应用技巧
  3. Grasshopper GHPython 报错: Solution exception:找不到方法: “Void Microsoft.Scripting.Utils
  4. coreseek java_基于Sphinx的中文全文检索引擎Coreseek的安装
  5. ubuntu 16.04 蓝牙鼠标 (可连接但是无法使用)
  6. 怎样下载企业通讯录Excel模板
  7. linux执行startx进入桌面黑屏,startx启动黑屏
  8. 普华永道计算机在线测评题库,普华永道笔试题及经验
  9. 2021年机修钳工(中级)及机修钳工(中级)复审模拟考试
  10. 电脑各配件故障速排方法