优先级队列的模拟实现
import java.util.Arrays;
public class MyHeap {
public int[] elem;
public int usedSized;
public MyHeap() {
this.elem = new int[10];
}
public void initArray(int[] arr) { //初始化堆
for (int i = 0; i < arr.length; i++) {
this.elem[i] = arr[i];
this.usedSized++;
}
}
public void createHeap() {
for (int parent = (usedSized-1-1); parent >= 0; parent--) {
siftDown(parent, usedSized);
}
}
private void siftDown(int parent, int usedSized) { // 向下调整
int child = parent * 2 + 1;
while (child < usedSized) {
if (child + 1 < usedSized && elem[child] < elem[child+1]) {
child++;
}
if (elem[child] > elem[parent]) {
int tmp = elem[child];
elem[child] = elem[parent];
elem[parent] = tmp;
parent = child;
child = 2 * parent + 1;
} else {
break;
}
}
}
public void offer(int val) {
if (isFull()) {
this.elem = Arrays.copyOf(elem, 2*elem.length);
}
elem[usedSized] = val;
siftUp(usedSized);
usedSized++;
}
private void siftUp(int child) { // 向上调整
int parent = (child - 1) / 2;
while (parent >= 0) {
if (elem[child] > elem[parent]) {
int tmp = elem[child];
elem[child] = elem[parent];
elem[parent] = tmp;
child = parent;
parent = (child - 1) / 2;
} else {
break;
}
}
}
public boolean isFull() {
return usedSized == this.elem.length;
}
public int poll() { // 堆的删除
if (isEmpty()) {
return -1;
}
int val = elem[0];
swap(0, usedSized - 1);
usedSized--;
siftDown(0, usedSized);
return val;
}
private void swap(int a, int b) {
int tmp = elem[a];
elem[a] = elem[b];
elem[b] = tmp;
}
public boolean isEmpty() { // 获取堆顶元素
return usedSized == 0;
}
public int peek() {
if (isEmpty()) {
return -1;
}
return elem[0];
}
public void heapSort() { // 堆排序
int end = usedSized - 1;
while (end > 0) {
swap(0, end);
siftDown(0, end);
end--;
}
}
}
优先级队列的使用
优先级队列的构造
import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;
public class Test {
public static void main(String[] args) {
// 无参构造,默认是小堆
PriorityQueue<Integer> queue1 = new PriorityQueue<>();
// 创建容量为100的优先级队列
PriorityQueue<Integer> queue2 = new PriorityQueue<>(100);
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
// 用其他集合创捷
PriorityQueue<Integer> queue3 = new PriorityQueue<>(list);
}
}
大堆的构造
import java.util.Comparator;
import java.util.PriorityQueue;
public class Test implements Comparator<Integer> { // 实现Comparator接口
public static void main(String[] args) {
PriorityQueue<Integer> queue1 = new PriorityQueue<>(new Test());
queue1.offer(1);
queue1.offer(2);
queue1.offer(3);
queue1.offer(4);
queue1.offer(5);
System.out.println(queue1);
}
@Override // 重写 compare 方法
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
@Override
public boolean equals(Object obj) {
return false;
}
}
优先级队列的常用方法
import java.util.PriorityQueue;
public class Test {
public static void main(String[] args) {
PriorityQueue<Integer> queue1 = new PriorityQueue<>();
queue1.offer(1); // 插入元素
queue1.offer(2);
queue1.offer(3);
System.out.println(queue1.peek()); // 获取堆顶元素
queue1.poll(); // 删除堆顶元素
System.out.println(queue1.size()); // 返回堆大小
queue1.clear(); // 清空堆
System.out.println(queue1.isEmpty()); // 返回堆是否为空
}
}
参与讨论
(Participate in the discussion)
参与讨论