| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 【算法】Leetcode第215题堆排序内部原理分析(C++) -> 正文阅读 |
|
[数据结构与算法]【算法】Leetcode第215题堆排序内部原理分析(C++) |
1.前言
2.基本原理2.1构建二叉堆我们可以用一个完全二叉树去表示数组,根结点在位置0,它的子结点在位置1和2,而子结点的子结点则分别在位置3、4、5、6,以此类推,直到数组元素都用完。这样形成的二叉树,又称二叉堆。 二叉堆是一组能够用推有序的完全二叉树排序的元素,并在数组中按层级存储。在下文中,我们将二叉堆称为堆。 在一个堆中,位置k的结点的子结点的位置分别为2k + 1 和 2k + 2。 比如位置1的结点的子结点分别是位置3和位置4。倘若位置是从1开始,则这个关系变成2k和2k+1。因为数组的序号从0开始,所以还是用前者的公式表达关系。 一开始的数组是无序的,意味着构建出来的堆也是无序的,那么就需要对堆进行有序化。 2.2 由上至下的推有序化(下沉)如果堆的有序状态因为某个节点变得比它的子结点更小而被打破,那么我们需要通过交换它和它的子结点较大值来修复堆。交换后,它可能会也比新的子结点小,所以要继续交换。这种状态不断地把小的节点往下交换,所以形象地描述为下沉。 当一个结点太小的时候,它需要沉(sink)到堆的更低层。 可以先看看官方题解是如何进行下沉操作的。
对于元素a[i]进行判断,求得左孩子和右孩子为2i + 1和2i + 2。接着要进行越界判断,如果越界了,证明不存在左/右孩子。largest指向最大的值。 如果这个最大的值并不是a[i], 那就得执行下沉操作,下沉完后调用maxHeapify继续判断是否要继续下沉。 我觉得这里用个循环,让它不断下沉,直到不能再下沉,这样逻辑可能更加清晰。 这是对元素进行遍历,进入maxHeapify判断是否下沉操作,那为什么它是从heapSize/2判断呢?
首先下沉操作是从下往上的,所以i是递减的。对于i = heapSize/2,它的两个子结点分别是heapSize + 1和heapSize + 2,明显可见数组已经不存在这两个下标的元素。所以从heapSize/2的元素时不存在子结点的,也就没有下沉的可能性。 2.3 删除操作前面已经完成二叉堆的构建,这时元素在堆上已经是有序的,根结点是最大的数。 要想删除最大的元素,先把根结点和最后那个叶子结点交换,因为叶子结点删除了不影响,根节点删除了就乱套了。叶子结点放在根节点之后,它的大小是不足以坐在根节点的宝座上的,所以需要对它执行下沉操作,让它回到属于它的位置。
3.整体代码字母l实现太难看了,换成left。
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 10:26:16- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |