堆排序笔记
https://blog.csdn.net/u010452388/article/details/81283998
堆:每个节点都大于它子树的节点;是个完全二叉树。(用一维数组存储)
第i个元素的:
父亲:(i-1)/2
孩子: i*2+1 i*2+2
第1层标为0 ... 第h层最多有2的h次方个元素。h层最少一共有2的h+1幂个元素。
1,堆化数组,用自顶向下。在O(n)可完成。即只要排好第一个最大元素即可。构造出最大值堆。
1.1 构造堆,用自底向上。从第一个开始。需用nO(n).
2,自顶向下:从尾部开始做倒着往前,对每一个元素做自顶向下。叶子节点肯定都满足堆条件。第一个非叶子节点是 (n-1)/2做自顶向下(下面都是叶子,满足排好序了)。即从这里向下面的子树堆化。当前节点,找到它的两个子节点,从两个子节点中找出较大的。看当前节点是否大于较大的;是则较大成为当前节点;否则和当前和较大交换。继续做直到递归到底部。 O(log n)
自底向上:对一个初始乱序完全二叉树,从顶部开始,对每一个节点做自底向上。找它的父元素,确保都满足堆。第一个元素认为一个堆树,父为null,满足堆。第二个和它的父亲比较,不满足则交换;第三个类推。后面的都是,注意要一直和父类递归,直到顶端。
3,堆的删除。堆想象成苹果堆,只能取上面第一个。删除也只能删除第一个最大元素。删除后只能最后一个补上来(否则中间元素补上来,最后会空缺,不是完全树了),让这个补上来的位于第一个位置的做自顶向下堆化。 O(log n)
4,堆的插入: 扩大空间,插入到数组末尾(还是完全树)。执行自底向上堆化。 O(log n)
5, 最大元素:直接取 O(1)
6,排序:将最大值堆。第一个与最后一个交换。做个自顶向下。第一个与倒数第二个交换,做自顶向下。以此类推。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2019-03-08 硅谷夜谈
2019-03-08 指路Reactive Programming
2019-03-08 Spring WebFlux 要革了谁的命?
2018-03-08 我们如何用Go来处理每分钟100万复杂请求的场景
2018-03-08 Docker系列教程05 容器常用命令
2013-03-08 Ubuntu 用户安装文件较器meld使用,以及添加进右键菜单
2013-03-08 linux c 查看其它程序是否启动。没有则启动他