PriorityQueue 优先队列 -- 小顶堆

优先的含义

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

怎么加进去的

private static  void siftUpComparable(int k, T x, Object[] es) {
        Comparable key = (Comparable) 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接口的实现类都会有比较大小的方法)。

image.png

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

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

e就是当前数组中包含的值,所以如果要插入的key >= e,那么不用考虑,直接让key在下面呆着吧,他上不去。
如果是key 最终key把比他大的全部搞下去,他上位了!所以说最后只有第一个元素是最小的,其他元素无序。

你可能感兴趣的:(PriorityQueue 优先队列 -- 小顶堆)