二叉堆构造优先队列

    1. public class MaxPQ <Key extends Comparable<Key>> {
    2. // 存储元素的数组
    3. private Key[] pq;
    4. // 当前 Priority Queue 中的元素个数
    5. private int N = 0;
    6. public MaxPQ(int cap) {
    7. // 索引 0 不用,所以多分配一个空间
    8. pq = (Key[]) new Comparable[cap + 1];
    9. }
    10. /* 返回当前队列中最大元素 */
    11. public Key max() {
    12. return pq[1];
    13. }
    14. // 父节点的索引
    15. int parent(int root) {
    16. return root / 2;
    17. }
    18. // 左孩子的索引
    19. int left(int root) {
    20. return root * 2;
    21. }
    22. // 右孩子的索引
    23. int right(int root) {
    24. return root * 2 + 1;
    25. }
    26. /* 插入元素 e */
    27. public void insert(Key e) {
    28. N++;
    29. // 先把新元素加到最后
    30. pq[N] = e;
    31. // 然后让它上浮到正确的位置
    32. swim(N);
    33. }
    34. /* 删除并返回当前队列中最大元素 */
    35. public Key delMax() {
    36. // 最大堆的堆顶就是最大元素
    37. Key max = pq[1];
    38. // 把这个最大元素换到最后,删除之
    39. exch(1, N);
    40. pq[N] = null;
    41. N--;
    42. // 让 pq[1] 下沉到正确位置
    43. sink(1);
    44. return max;
    45. }
    46. /* 上浮第 k 个元素,以维护最大堆性质 */
    47. private void swim(int k) {
    48. while(k>1 && less(parent(k),k)) {
    49. exch(parent(k),k);
    50. k = parent(k);
    51. }
    52. }
    53. /* 下沉第 k 个元素,以维护最大堆性质 */
    54. private void sink(int k) {
    55. // 如果沉到堆底,就沉不下去了
    56. while (left(k) <= N) {
    57. // 先假设左边节点较大
    58. int older = left(k);
    59. // 如果右边节点存在,比一下大小
    60. if (right(k) <= N && less(older, right(k)))
    61. older = right(k);
    62. // 结点 k 比俩孩子都大,就不必下沉了
    63. if (less(older, k)) break;
    64. // 否则,不符合最大堆的结构,下沉 k 结点
    65. exch(k, older);
    66. k = older;
    67. }
    68. }
    69. /* 交换数组的两个元素 */
    70. private void exch(int i, int j) {
    71. Key temp = pq[i];
    72. pq[i] = pq[j];
    73. pq[j] = temp;
    74. }
    75. /* pq[i] 是否比 pq[j] 小? */
    76. private boolean less(int i, int j) {
    77. return pq[i].compareTo(pq[j]) < 0;
    78. }
    79. public static void main(String[] args) {
    80. // TODO Auto-generated method stub
    81. }
    82. }

    java库的优先队列

    • peek()//返回队首元素
    • poll()//返回队首元素,队首元素出队列
    • add()//添加元素
    • size()//返回队列元素个数
    • isEmpty()//判断队列是否为空,为空返回true,不空返回false