/** * 返回最大元素 */ public E max(){ if (isEmpty()) { thrownew IllegalArgumentException("empty MaxPriorityQueue"); }
return priorityQueue[1]; }
/** * 删除并返回最大元素 */ public E delMax(){ E max = priorityQueue[1]; swap(1, N--); // 最后一个元素为 priorityQueue[N],priorityQueue[N--] 先和最后一个元素交换,再减少 N priorityQueue[N + 1] = null; // help gc sink(1); return max; }
/** * 队列是否为空 */ publicbooleanisEmpty(){ return N == 0; }
/** * 队列元素个数 */ publicintsize(){ return N; }
/** * 上浮 */ privatevoidswim(int k){ while (k > 1 && less(k / 2, k)) { // k != 1,根元素不能上浮 swap(k / 2, k); k /= 2; } }
/** * 下沉 */ privatevoidsink(int k){ while (2 * k <= N) { int j = 2 * k; // j < N,则还有第 j + 1 个元素。 // 如果左节点小于右节点,则 j 后移动,使 priorityQueue[k] 总是与最大的节点比较 if (j < N && less(j, j + 1)) { j++; } if (!less(k, j)) { // 如果 priorityQueue[k] 的值不比最大的节点值大,则退出循环 break; } swap(k, j); k = j; } }
/** * 交换 priorityQueue[i] 和 priorityQueue[j] */ privatevoidswap(int i, int j){ E temp = priorityQueue[i]; priorityQueue[i] = priorityQueue[j]; priorityQueue[j] = temp; }
/** * 判断 priorityQueue[i] 是否小于 priorityQueue[j] */ privatebooleanless(int i, int j){ return priorityQueue[i].compareTo(priorityQueue[j]) < 0; }
publicstaticvoidmain(String[] args){ MaxPriorityQueue<Integer> maxPQ = new MaxPriorityQueue<>(10);
for (int i = 0; i < 10; i++) { maxPQ.insert(i); }
for (int i = 0; i < 10; i++) { System.out.print(maxPQ.delMax()); if (i != 9) { System.out.print(" | "); } } } }
测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
publicstaticvoidmain(String[] args){ MaxPriorityQueue<Integer> maxPQ = new MaxPriorityQueue<>(10);
for (int i = 0; i < 10; i++) { maxPQ.insert(i); }
for (int i = 0; i < 10; i++) { System.out.print(maxPQ.delMax()); if (i != 9) { System.out.print(" | "); } } }