当前位置: 首页>后端>正文

PriorityQueue优先队列 -- 小顶堆

优先的含义

PriorityQueue 中,会保证数组中第一个元素是数组的最大值,对于其他的元素大小顺序并不保证。

怎么加进去的

private static <T> void siftUpComparable(int k, T x, Object[] es) {
        Comparable<super T> key = (Comparable<super T>) x;
        while (k > 0) {
            int parent = (k - 1) >>> 1;
            Object e = es[parent];
            if (key.compareTo((T) e) >= 0)
                break;
            es[k] = e;
            k = parent;
        }
        es[k] = key;
    }

这里对外提供了两个加入的接口 add & offer。最终的都是调用的上面的代码。k就是当前数组的末尾索引,x就是要加进来的索引,es就是当前的数组。这里没有指定比较器,就是使用的默认比较方法(Comparable接口的实现类都会有比较大小的方法)。

PriorityQueue优先队列 -- 小顶堆,第1张

(k-1)>>>1 代表什么呢?也就是无符号右移一位,也就是除以2。由于数组索引为0,所以-1也就那么回事。所以为什么最后的名称是parent,也就可以解释了。
那么进入判断

 if (key.compareTo((T) e) >= 0)     break;

e就是当前数组中包含的值,所以如果要插入的key >= e,那么不用考虑,直接让key在下面呆着吧,他上不去。
如果是key<e呢,说明这个e需要把位置让给key,因为他更大。那么e就是放到了key的位置。key当然也不是一定就在e原来的位置,因为循环还没有结束。
最终key把比他大的全部搞下去,他上位了!所以说最后只有第一个元素是最小的,其他元素无序。


https://www.xamrdz.com/backend/3ac1941365.html

相关文章: