📅  最后修改于: 2023-12-03 14:42:58.114000             🧑  作者: Mango
最小(小根)堆是一种数据结构,它与最大(大根)堆很相似,只不过最小堆的根节点是所有节点中最小的,而最大堆的根节点是所有节点中最大的。最小堆的主要应用是在优先队列、堆排序和图算法中。
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]