4.25 由堆的定义到优先队列,堆排序
1 堆(本质是一个数组)
1.1 定义
堆必须是一个完全二叉树()
1.2 完全二叉树的性质
性质1:只允许最后一行不为满
性质2:最后一行必须从左往右排序且没有间隔
1.3 堆的分类(有堆序性)
大根堆:父节点元素大于子节点元素
小根堆:父节点元素小于子节点元素
1.4 堆的存储
编号:从上到下,从左到右给堆编号

节点下标规律
节点下标为i,左子节点下标为2i+1,右子节点下标为2i+2
1.5 堆的基本操作(把树调整成堆)
下滤:把破坏堆序性的元素跟他的最大的子节点比较,如果小于他的子节点,则交换,直到小于他的子节点或者到底部
上滤:子元素和父元素比较
……
复杂度为O(logn)
1.5 建堆
自顶向下建堆法:将新元素放到堆的最后一位,然后进行上滤操作,复杂度Nlogn
自下而上建堆法:先把数组的元素调整成堆,再从倒数第二排开始,对每个元素进行下滤操作,复杂度为o(n)
1.6具体应用:优先队列
功能:插入队列,弹出最小元素
小根堆:弹出顶上的元素,然后将最后一个元素放到根结点,进行下滤操作
java代码
PriorityQueue
lists.length, (a, b) -> (a.val - b.val));创建一个小根堆(小的元素排前面)
x.add(E e):将指定的元素插入此优先队列。如果成功插入则返回 true。
x.offer(E e):将指定的元素插入此优先队列。与 add 方法类似,但在容量受限的队列中,此方法可能更合适,因为它可以返回 false 表示插入失败。
x.poll():获取并移除队列的头部元素,如果队列为空则返回 null。
x.peek():获取但不移除队列的头部元素,如果队列为空则返回 null。
x.remove(Object o):从此队列中移除指定元素的单个实例(如果存在)。

浙公网安备 33010602011771号