实现 Java 大顶堆小顶堆

1. 简介

在 Java 中,可以使用 PriorityQueue 类来实现大顶堆和小顶堆。PriorityQueue 是一个基于优先级的队列,它的元素按照某种优先级顺序进行排序。默认情况下,PriorityQueue 是一个小顶堆,即最小的元素位于队列的头部。可以通过自定义 Comparator 来实现大顶堆。

2. 实现步骤

下面是实现 Java 大顶堆和小顶堆的步骤:

步骤 描述
1. 创建 PriorityQueue 对象 创建一个 PriorityQueue 对象来存储堆中的元素。
2. 定义 Comparator 如果要实现大顶堆,需要定义一个实现 Comparator 接口的类来指定元素的比较方式。
3. 添加元素 使用 add() 方法向 PriorityQueue 中添加元素。
4. 弹出堆顶元素 使用 poll() 方法弹出堆顶元素。

接下来,我们具体讲解每一步需要做什么,并给出相应的代码。

3. 代码示例

3.1 创建 PriorityQueue 对象

首先,我们需要创建一个 PriorityQueue 对象来存储堆中的元素。在创建 PriorityQueue 对象时,可以通过传入一个 Comparator 来指定元素的比较方式。如果不传入 Comparator,则默认为小顶堆。

import java.util.PriorityQueue;

PriorityQueue<Integer> minHeap = new PriorityQueue<>();

3.2 定义 Comparator

如果要实现大顶堆,我们需要定义一个实现 Comparator 接口的类来指定元素的比较方式。Comparator 接口有一个 compare() 方法,我们需要实现该方法来定义元素的比较规则。在比较规则中,返回一个正数表示第一个元素大于第二个元素,返回一个负数表示第一个元素小于第二个元素,返回 0 表示两个元素相等。

import java.util.Comparator;

class MaxHeapComparator implements Comparator<Integer> {
    @Override
    public int compare(Integer a, Integer b) {
        return b - a;
    }
}

PriorityQueue<Integer> maxHeap = new PriorityQueue<>(new MaxHeapComparator());

3.3 添加元素

通过调用 add() 方法,我们可以向 PriorityQueue 中添加元素。添加元素后,PriorityQueue 会根据元素的比较方式进行排序。

minHeap.add(10);
minHeap.add(5);
minHeap.add(15);

3.4 弹出堆顶元素

通过调用 poll() 方法,我们可以弹出 PriorityQueue 的堆顶元素。弹出的元素是根据堆的排序规则确定的。

Integer minElement = minHeap.poll();

4. 序列图

下面是实现 Java 大顶堆小顶堆的序列图:

sequenceDiagram
    participant Developer as 开发者
    participant Rookie as 刚入行的小白
    Developer -> Rookie: 介绍 Java 大顶堆小顶堆的实现
    Note over Rookie: 学习实现步骤
    Rookie -> Developer: 完成学习
    Developer -> Rookie: 看代码示例和解释
    Rookie -> Developer: 写代码实现
    Developer -> Rookie: 提供反馈和建议
    Rookie -> Developer: 修改代码
    Developer -> Rookie: 验证代码是否正确
    Rookie -> Developer: 代码正确,感谢帮助
    Developer -> Rookie: 不客气,随时可以提问

5. 甘特图

下面是实现 Java 大顶堆小顶堆的甘特图:

gantt
    dateFormat  YYYY-MM-DD
    title 实现 Java 大顶堆小顶堆甘特图

    section 创建 PriorityQueue 对象
    创建 PriorityQueue 对象       :done, 2022-01-01, 1d

    section 定义 Comparator
    定义 Comparator       :done, 2022-01-02, 2d

    section 添加元素
    添加元素       :done, 2022-01-04, 1d