【底层代码欣赏】—— PriorityQueue的offer方法

 1 //offer(E e)
 2 public boolean offer(E e) {
 3     if (e == null)//不允许放入null元素
 4         throw new NullPointerException();
 5     modCount++;
 6     int i = size;
 7     if (i >= queue.length)
 8         grow(i + 1);//自动扩容
 9     size = i + 1;
10     if (i == 0)//队列原来为空,这是插入的第一个元素
11         queue[0] = e;
12     else
13         siftUp(i, e);//调整
14     return true;
15 }

向上调整,保证完全二叉树为最小堆

 1 //siftUp()
 2 private void siftUp(int k, E x) {
 3     while (k > 0) {
 4         int parent = (k - 1) >>> 1;//parentNo = (nodeNo-1)/2
 5         Object e = queue[parent];
 6         if (comparator.compare(x, (E) e) >= 0)//调用比较器的比较方法
 7             break;
 8         queue[k] = e;
 9         k = parent;
10     }
11     queue[k] = x;
12 }

 图解:

 

posted @ 2021-11-08 13:36  吾辈当奋斗-生生不息  阅读(187)  评论(0)    收藏  举报