import java.util.Arrays;
/**
* 优先队列
* 功能:
* 1.offer - 添加,如果达到容量上限且无法自动扩容,返回false
* 2.poll - 移除 -- 按顺序
* 3.peek - 查看栈顶元素
* 4.grow - 如果达到容量上限,自动扩容
* 5.isEmpty - 检查是否为空
* 思路:
* 构建小顶堆
* 每次offer,将数据放到末尾,向上调整(小数上浮)
* 每次poll,将末尾的数放到最前,向下调整(大数下沉)
*/
public class PriorityQueue {
int size = 0;
int[] nums;
public PriorityQueue() {
nums = new int[16];
}
public boolean offer(int n) {
if (size == nums.length) grow();
if (size == nums.length) return false;
// 小数上浮
siftUp(n, size++);
return true;
}
private void siftUp(int target, int i) {
int child = i, parent;
while (child > 0) {
parent = (child - 1) >> 1;
if (nums[parent] <= target) break;
nums[child] = nums[parent];
child = parent;
}
nums[child] = target;
}
public int poll() {
if (isEmpty()) throw new IndexOutOfBoundsException("队列为空");
int res = nums[0];
size--;
// 大数下沉
siftDown(nums[size], size);
return res;
}
private void siftDown(int target, int i) {
int parent = 0, child;
while ((child = (parent << 1) + 1) < i) {
if (child + 1 < i && nums[child + 1] < nums[child]) child++;
if (target <= nums[child]) break;
nums[parent] = nums[child];
parent = child;
}
nums[parent] = target;
}
public int peek() {
if (isEmpty()) throw new IndexOutOfBoundsException("队列为空");
return nums[0];
}
private void grow() {
if (nums.length == Integer.MAX_VALUE) return;
int len = nums.length << 1;
if (len < 0) len = Integer.MAX_VALUE;
System.out.println(String.format("完成扩容:%d -> %d", nums.length, len));
nums = Arrays.copyOf(nums, len);
}
public boolean isEmpty() {
return size == 0;
}
public static void main(String[] args) {
PriorityQueue queue = new PriorityQueue();
int[] arr = new int[]{35, 88, 45, 37, 91, 26, 13, 66, 50, 16, 7, 3, 20, 17, 8, 67, 21};
for (int i : arr) {
queue.offer(i);
}
for (int i = 0; i < arr.length; i++) {
arr[i] = queue.poll();
}
System.out.println(Arrays.toString(arr));
System.out.println(queue.peek());
}
}
PriorityQueue原理与最简实现[java]
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 问:谈谈你对二叉堆数据结构的理解及在 PriorityQueue 中的实现? 答:这算是一道比较有深度的问题了,要...
- 什么是优先队列? 优先队列是一种能按照数据的优先级,在输出的时候能依次输出的一种数据结构。 优先队列的核心方法 *...
- 转载请注明来源 赖赖的博客 前景概要 在 01 走进Spring,Context、Bean和IoC 中,我们看到了...
- 章节目录 原子操作含义 相关术语 保证多处理器操作原子性的两种方式 Java语言层面上实现原子操作 原子操作的含义...