堆排序分析(大根堆为例,由小到大排序)
时间复杂度为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];
}
堆排序分析(大根堆为例,由小到大排序)相关推荐
- java实现堆排序_Java实现堆排序(大根堆)
堆排序是一种树形选择排序方法,它的特点是:在排序的过程中,将array[0,...,n-1]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲节点和孩子结点之间的内在关系,在当前无序区中选择关键 ...
- C语言实现选择排序——堆排序(大根堆、小根堆)
C语言实现堆排序 文章目录 C语言实现堆排序 大根堆排序算法 1.交换操作 2.对结点进行调整为大根堆 3.建立大根堆 4.大根堆排序算法实现 小根堆排序算法 1.交换操作 2.对结点进行调整为小根堆 ...
- 堆排序(大根堆与小根堆)
(1)是什么? 是一种适用于关键字较多的情况下的排序算法,例如在十亿个数中选出前1000个最大值或者最小值 如果在传统的排序算法中(例如冒泡,插入等),我们习惯把目标数据整体进行一次排序,再截取出前1 ...
- 堆排序-以小根堆为例
文章目录 前言 一.什么是堆 二.堆排序过程 1.创建堆 2.堆排序 总结 前言 刷力扣题,遇到堆排序,考研完后就没接触数据结构,忘的差不多了,现在重现拾起来. 一.什么是堆 堆,这个词很形象,谷堆. ...
- Java实现堆排序(大根堆),实战
//构建大根堆:将array看成完全二叉树的顺序存储结构 private int[] buildMaxHeap(int[] array){ //从最后一个节点array.length-1的父节点(ar ...
- 堆排序(最小堆为例)
最小堆:每个节点的值都小于其左孩子和右孩子节点的值. 1.按完全二叉树的顺序插入要排序的元素. 2.若此元素a大于它的根节点b,则a和b交换位置. 取数据时: 1.取得根节点的数据,然后把完全二叉树的 ...
- 大根堆和小根堆的区别
大根堆和小根堆的区别 文章转自:https://blog.csdn.net/weixin_37197708/article/details/79546535 堆的概念 堆实际上是一棵完全二叉树,其任何 ...
- 大根堆、小根堆(数组模拟操作)
1.什么是大根堆.小根堆? 首先堆应该是一颗完全二叉树,大根堆就是二叉树的所有父节点的值都比左右孩子的值大,小根相反.下面是大根堆和小根堆的图: 如上,左图是一个大根堆,右图是一个小根堆. 2.树的数 ...
- 浅谈大根堆,小根堆,以及堆排序(python)实现
既然要说堆排序,那么必然要说说什么是大根堆,小根堆了. 大根堆: 若根节点存在左右子节点,那么根节点的值大于或等于左右子节点的值. 小根堆: 若根节点存在左右子节点,那么根节点的值小于或等于左右子节点 ...
最新文章
- itmz文件如何打开_如何使用proteus8打开低版本proteus7的仿真文件?
- qmake以及makefile总结
- Java未解析编译_无法解析的编译问题:
- 1.odoo13之跟着官网做项目/实例(创建模块、创建模型类、配置角色安全权限文件)
- react追加html元素,React给添加元素增加样式
- linux安装python库报错pywin32_完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误...
- 带有JWT示例的​​Spring Oauth2
- tf.keras.layers.Permute
- 呕心沥血干完K-Means聚类——深度AI科普团队
- 软考高级论文如何“吹”
- 在vue的项目中引入swiper插件
- 【Luogu】重返现世
- MATLAB db4小波分解与重构,语音降噪
- nginx学习-负载均衡-keepalived高可用-反向代理
- hive 自定义UDF函数解析HTML
- Word排版技巧分享
- 斐波那契数列(经典兔子繁殖问题)
- 历史上的今天——4月1日
- 程伟健:新城易居携手中旅联盟深度发力打造城市中心文旅目的地
- Gogs-轻量级代码仓库
热门文章
- 完全卸载oracle11g教程、Oracle11g的卸载方法和步骤
- JAVA_OA(五)(番外篇):SpringMVC乱码解决(post,get)
- Ubuntu中的vi模式中的按上下左右键变成ABCD解决方法
- 洛谷P1095守望者的逃离题解-伪动态规划/贪心
- swift学习笔记-UI篇之UIImageView
- C#---HTML 转文本及HTML内容提取
- Hlg 1407 【最小点权覆盖】.cpp
- 【C#】三维立体验证码 (3DCaptcha)
- 【译】在ASP.Net和IIS中删除不必要的HTTP响应头
- C++ Primer 5th笔记(chap 17 标准库特殊设施)未格式化的输入/输出操作