时间复杂度为O(nlogn),思路就是从最后一个非叶结点开始,依次往回遍历每个结点,将以该结点为根的子树建立成大根堆,直到遍历到整棵完全二叉树的根结点时为止,此时整棵树为大根堆。

以当前结点为根的子树建立大根堆:

//向下调整,将该结点的子树变成大根堆
void AdjustDown(int A[],int k,int len){ //k为根结点编号,len为数组长度 int i,j;A[0]=A[k];for(j=2*k;j<=len;j*=2){if(j<len&&A[j]<A[j+1]) //右孩子较大j++;if(A[0]<A[j]){A[k]=A[j];k=j; }else break;}A[k]=A[0];
}

堆排序算法:

//堆排序算法
void HeapSort(int A[],int len){int i,temp;for(i=len/2;i>=1;i--)    //建立初始大根堆AdjustDown(A[],i,len); //从len/2到1,反复调整堆for(i=len;i>1;i--){temp=A[1];A[1]=A[i];A[i]=temp; //把最大的元素放到了最后面,最终排序结果为由小到大AdjustDown(A[],1,i-1); //把剩余i-1个元素整理成堆}
}

这样排序的结果为由小到大! 

如果插入元素的话,直接插入到最后的位置,然后将插入的元素向上调整,直到整棵树再次变成大根堆时为止!

向上调整的代码:

//插入元素到最后位置,需要向上调整建立大根堆
void AdjustUp(int A[],int len){A[0]=A[len];int i=len/2,j=len;while(i>0&&A[i]<A[0]){A[j]=A[i]; //双亲结点下调j=i;i/=2; //继续向上比较 }A[j]=A[0];
}

堆排序分析(大根堆为例,由小到大排序)相关推荐

  1. java实现堆排序_Java实现堆排序(大根堆)

    堆排序是一种树形选择排序方法,它的特点是:在排序的过程中,将array[0,...,n-1]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲节点和孩子结点之间的内在关系,在当前无序区中选择关键 ...

  2. C语言实现选择排序——堆排序(大根堆、小根堆)

    C语言实现堆排序 文章目录 C语言实现堆排序 大根堆排序算法 1.交换操作 2.对结点进行调整为大根堆 3.建立大根堆 4.大根堆排序算法实现 小根堆排序算法 1.交换操作 2.对结点进行调整为小根堆 ...

  3. 堆排序(大根堆与小根堆)

    (1)是什么? 是一种适用于关键字较多的情况下的排序算法,例如在十亿个数中选出前1000个最大值或者最小值 如果在传统的排序算法中(例如冒泡,插入等),我们习惯把目标数据整体进行一次排序,再截取出前1 ...

  4. 堆排序-以小根堆为例

    文章目录 前言 一.什么是堆 二.堆排序过程 1.创建堆 2.堆排序 总结 前言 刷力扣题,遇到堆排序,考研完后就没接触数据结构,忘的差不多了,现在重现拾起来. 一.什么是堆 堆,这个词很形象,谷堆. ...

  5. Java实现堆排序(大根堆),实战

    //构建大根堆:将array看成完全二叉树的顺序存储结构 private int[] buildMaxHeap(int[] array){ //从最后一个节点array.length-1的父节点(ar ...

  6. 堆排序(最小堆为例)

    最小堆:每个节点的值都小于其左孩子和右孩子节点的值. 1.按完全二叉树的顺序插入要排序的元素. 2.若此元素a大于它的根节点b,则a和b交换位置. 取数据时: 1.取得根节点的数据,然后把完全二叉树的 ...

  7. 大根堆和小根堆的区别

    大根堆和小根堆的区别 文章转自:https://blog.csdn.net/weixin_37197708/article/details/79546535 堆的概念 堆实际上是一棵完全二叉树,其任何 ...

  8. 大根堆、小根堆(数组模拟操作)

    1.什么是大根堆.小根堆? 首先堆应该是一颗完全二叉树,大根堆就是二叉树的所有父节点的值都比左右孩子的值大,小根相反.下面是大根堆和小根堆的图: 如上,左图是一个大根堆,右图是一个小根堆. 2.树的数 ...

  9. 浅谈大根堆,小根堆,以及堆排序(python)实现

    既然要说堆排序,那么必然要说说什么是大根堆,小根堆了. 大根堆: 若根节点存在左右子节点,那么根节点的值大于或等于左右子节点的值. 小根堆: 若根节点存在左右子节点,那么根节点的值小于或等于左右子节点 ...

最新文章

  1. itmz文件如何打开_如何使用proteus8打开低版本proteus7的仿真文件?
  2. qmake以及makefile总结
  3. Java未解析编译_无法解析的编译问题:
  4. 1.odoo13之跟着官网做项目/实例(创建模块、创建模型类、配置角色安全权限文件)
  5. react追加html元素,React给添加元素增加样式
  6. linux安装python库报错pywin32_完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误...
  7. 带有JWT示例的​​Spring Oauth2
  8. tf.keras.layers.Permute
  9. 呕心沥血干完K-Means聚类——深度AI科普团队
  10. 软考高级论文如何“吹”
  11. 在vue的项目中引入swiper插件
  12. 【Luogu】重返现世
  13. MATLAB db4小波分解与重构,语音降噪
  14. nginx学习-负载均衡-keepalived高可用-反向代理
  15. hive 自定义UDF函数解析HTML
  16. Word排版技巧分享
  17. 斐波那契数列(经典兔子繁殖问题)
  18. 历史上的今天——4月1日
  19. 程伟健:新城易居携手中旅联盟深度发力打造城市中心文旅目的地
  20. Gogs-轻量级代码仓库

热门文章

  1. 完全卸载oracle11g教程、Oracle11g的卸载方法和步骤
  2. JAVA_OA(五)(番外篇):SpringMVC乱码解决(post,get)
  3. Ubuntu中的vi模式中的按上下左右键变成ABCD解决方法
  4. 洛谷P1095守望者的逃离题解-伪动态规划/贪心
  5. swift学习笔记-UI篇之UIImageView
  6. C#---HTML 转文本及HTML内容提取
  7. Hlg 1407 【最小点权覆盖】.cpp
  8. 【C#】三维立体验证码 (3DCaptcha)
  9. 【译】在ASP.Net和IIS中删除不必要的HTTP响应头
  10. C++ Primer 5th笔记(chap 17 标准库特殊设施)未格式化的输入/输出操作