【底层代码欣赏】—— 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 }
图解:


浙公网安备 33010602011771号