Java 大根堆与小根堆

堆:堆是一个完全二叉树,但存储的数据并非顺序,而是偏序(即并非完全有序)
大根堆:父节点大于两个子节点的值
小根堆:父节点小于两个子节点的值
注意:
堆的根节点中存放的是最大或者最小元素,但是其他节点的排序顺序是未知的。例如,在一个大根堆中,最大的那一个元素总是位于第一个位置,但是最小的元素则未必是最后一个元素。唯一能够保证的是最小的元素是一个叶节点,但是不确定是哪一个。

小根堆

大根堆

Java中定义堆可以使用优先队列(PriorityQueue)
小根堆:队首元素始终为队列中最小元素
大根堆:队首元素始终为队列中最大元素

  • 定义小根堆(在new一个优先队列时,默认生成小根堆)
    PriorityQueue queue = new PriorityQueue<>();

  • 定义大根堆

    1. 标准写法
      PriorityQueue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() {
      @Override
      public int compare(Integer o1, Integer o2) {
          return o2.compareTo(o1);
      }
      });
    
    1. 简化版
      PriorityQueue<Integer> queue = new PriorityQueue<>((o1, o2)->o2.compareTo(o1));
    

      PriorityQueue<Integer> queue = new PriorityQueue<>(Collections.reverseOrder());
    
  • 实例

    1. 小根堆
          PriorityQueue<Integer> queue = new PriorityQueue<>();
          queue.add(3);
          queue.add(1);
          queue.add(2);
          while (!queue.isEmpty()){
              System.out.println("小根堆打印:"+queue.poll());
          }
    

    打印结果:

    1. 大根堆
          PriorityQueue<Integer> queue = new PriorityQueue<>( (o1,o2) -> (o2 - o1));
          queue.add(3);
          queue.add(1);
          queue.add(2);
          while (!queue.isEmpty()){
              System.out.println("大根堆打印:"+queue.poll());
          }
    

    打印结果:

posted @ 2022-02-24 23:18  Mr_RainDrop  阅读(569)  评论(0)    收藏  举报