📜  Java中的最小堆(1)

📅  最后修改于: 2023-12-03 14:42:58.114000             🧑  作者: Mango

Java中的最小堆

最小(小根)堆是一种数据结构,它与最大(大根)堆很相似,只不过最小堆的根节点是所有节点中最小的,而最大堆的根节点是所有节点中最大的。最小堆的主要应用是在优先队列、堆排序和图算法中。

实现

Java中提供了一个优先队列的实现,该实现是基于最小堆的,因此我们可以通过Java提供的优先队列类来使用最小堆。Java中的PriorityQueue(优先队列)类使用了最小堆来实现,其中元素按照比较器所定义的优先级进行排序。

创建一个最小堆

我们可以使用Java中的PriorityQueue类来创建一个最小堆。以下是创建一个最小堆的示例代码:

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

默认情况下,PriorityQueue类创建的是一个最小堆,其中元素会按照自然排序进行排序。如果我们要自定义元素的排序规则,可以指定比较器,如下所示:

PriorityQueue<Integer> minHeap = new PriorityQueue<>(Comparator.reverseOrder());

此时,PriorityQueue类创建的将是一个最大堆。

插入元素和删除元素

向最小堆中插入元素可以使用Java中PriorityQueue类提供的add()和offer()方法。其实这两个方法是等价的,它们都会将元素添加到最小堆中。

minHeap.add(3);
minHeap.offer(5);

从最小堆中删除元素可以使用poll()和remove()方法。这两个方法也是等价的,它们都会删除并返回最小元素。

int min = minHeap.poll();
int secondMin = minHeap.remove();
获取最小元素

获取最小元素可以使用Java中PriorityQueue类提供的peek()方法,它会返回最小元素,但不会删除该元素。

int min = minHeap.peek();
示例

以下是一个使用最小堆对整数数组进行排序的示例代码:

import java.util.Arrays;
import java.util.PriorityQueue;

public class Main {
    public static void main(String[] args) {
        int[] arr = { 7, 10, 5, 3, 8, 4, 2, 9, 6 };
        PriorityQueue<Integer> minHeap = new PriorityQueue<>();

        for (int num : arr) {
            minHeap.add(num);
        }

        for (int i = 0; i < arr.length; i++) {
            arr[i] = minHeap.poll();
        }

        System.out.println(Arrays.toString(arr));
    }
}

在上述示例代码中,我们使用最小堆对整数数组进行排序。我们首先将整数数组中的元素加入到最小堆中,然后依次取出最小元素,将其放入原数组中。最后,我们输出排序后的数组。输出结果为:

[2, 3, 4, 5, 6, 7, 8, 9, 10]