前言 逆水行舟,不进则退!!! 目录 认识堆 堆的创建 1,向下调整的方法建立堆 2,以向下调整的方式建立小根堆 3,向上调整的方式建堆 堆的插入 堆的删除 堆排序 堆排序稳定性证明 TOP-K问题 实现堆操作的完整代码 认识堆 堆其实是一棵完全二叉树,完全二叉树是一种特殊的二叉树,除了最后一层外,每一层都被完全填满,最后一层从左到右填充。 对于完全二叉树(根节点下标为0)中任意一个下标为i的结点,它的左孩子结点下标为2i+1,右孩子结点下标为2i+2,父节点下标为(i-
1.大根堆1.1定义 大根树:树中的每一个节点的值都大于或等于其子节点的值 大根堆:既是大根树又是完全二叉树(增加了完全二叉树的限制条件)所以下图中只有(a)和(c)是大根堆 1.2大根堆的插入(数组实现) 假设在下面大根堆中插入一个元素9,插入步骤如下,时间复杂度为O(height)=O(logn)尝试插入在6号位置,如果新的元素小于3号位置,则插入;否则把3号位置的元素向下移动到6号位置尝试插入在3号位置,如果新的元素小于1号元素,则插入;否则把1号位置的元素向下移动到3号位置,循环终止//为theElement寻找插入位置,currentNode从新叶子节点开始向上移动intcur
(1)是什么?是一种适用于关键字较多的情况下的排序算法,例如在十亿个数中选出前1000个最大值或者最小值如果在传统的排序算法中(例如冒泡,插入等),我们习惯把目标数据整体进行一次排序,再截取出前1000个最小的或者最大的。但是我们可以设想一下,从一开始我们目标就只要1000个,那么其实其余九亿九千九百九十九万九千个数据,我们压根不需要知道它们的排序顺序,只需要知道它们都比我们1000个目标数据中最大值都要大就可以了这就是堆排序。它的思想整体上非常清晰简单,结构上是一个完全二叉树。根结点比左右孩子都大则叫做大根堆。其中,左右孩子的根结点,又会比它们的左右孩子都大。根结点比左右孩子都小则叫做小根堆