PriorityQueue
1 | arduino复制代码public PriorityQueue(int initialCapacity, |
上浮图片
offer 向堆中添加元素 向上比较
1 | ini复制代码public boolean offer(E e) { |
siftUp 向上比较
1 | scss复制代码private void siftUp(int k, E x) { |
siftUpComparable 构建最小堆
1 | ini复制代码private void siftUpComparable(int k, E x) |
poll 取出队列中的队首数据 删除元素
1 | scss复制代码public E poll() { |
siftDown 下沉 k=0 | x 最后一个元素
1 | scss复制代码private void siftDown(int k, E x) { |
siftDownComparable(k, x); k=0 | x 最后一个元素 就是从第一个元素开始
1 | ini复制代码private void siftDownComparable(int k, E x) { |
下沉图片
heapify 将一个无序数组构造成最小堆
1 | arduino复制代码private void heapify() |
heapify图形结合
我们观察下用数组a建成的二叉堆,很明显,对于叶子节点4、15、11、1、3来说,它们已经是一个合法的堆。所以只要最后一个节点的父节点,也就是最后一个非叶子节点a[4]=10开始调整,然后依次调整a[3]=12,a[2]=5,a[1]=6,a[0]=7,分别对这几个节点做一次”下移”操作就可以完成了堆的构造。ok,我们还是用图解来分析下这个过程。
假设有一个无序的数组,要求我们将这个数组建成一个二叉堆,你会怎么做呢?最简单的办法当然是将数组的数据一个个取出来,调用入队方法。但是这样做,每次入队都有可能会伴随着元素的移动,这么做是十分低效的。那么有没有更加高效的方法呢,我们来看下。
本文转载自: 掘金