import java.util.Arrays;
/**
* 優(yōu)先隊列
* 功能:
* 1.offer - 添加逸吵,如果達到容量上限且無法自動擴容惰蜜,返回false
* 2.poll - 移除 -- 按順序
* 3.peek - 查看棧頂元素
* 4.grow - 如果達到容量上限,自動擴容
* 5.isEmpty - 檢查是否為空
* 思路:
* 構(gòu)建小頂堆
* 每次offer碟绑,將數(shù)據(jù)放到末尾俺猿,向上調(diào)整(小數(shù)上浮)
* 每次poll格仲,將末尾的數(shù)放到最前押袍,向下調(diào)整(大數(shù)下沉)
*/
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;
// 小數(shù)上浮
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--;
// 大數(shù)下沉
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原理與最簡實現(xiàn)[java]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宽闲,“玉大人众眨,你說我怎么就攤上這事∪菸埽” “怎么了娩梨?”我有些...
- 文/不壞的土叔 我叫張陵,是天一觀的道長览徒。 經(jīng)常有香客問我狈定,道長,這世上最難降的妖魔是什么习蓬? 我笑而不...
- 正文 為了忘掉前任纽什,我火速辦了婚禮,結(jié)果婚禮上友雳,老公的妹妹穿的比我還像新娘稿湿。我一直安慰自己,他們只是感情好押赊,可當我...
- 文/花漫 我一把揭開白布饺藤。 她就那樣靜靜地躺著,像睡著了一般流礁。 火紅的嫁衣襯著肌膚如雪涕俗。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼栖疑,長吁一口氣:“原來是場噩夢啊……” “哼讨永!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起遇革,我...
- 正文 年R本政府宣布囚痴,位于F島的核電站叁怪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏深滚。R本人自食惡果不足惜奕谭,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望痴荐。 院中可真熱鬧血柳,春花似錦、人聲如沸生兆。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽鸦难。三九已至根吁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間合蔽,已是汗流浹背击敌。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 問:談談你對二叉堆數(shù)據(jù)結(jié)構(gòu)的理解及在 PriorityQueue 中的實現(xiàn)? 答:這算是一道比較有深度的問題了鞍陨,要...
- 什么是優(yōu)先隊列步淹? 優(yōu)先隊列是一種能按照數(shù)據(jù)的優(yōu)先級,在輸出的時候能依次輸出的一種數(shù)據(jù)結(jié)構(gòu)诚撵。 優(yōu)先隊列的核心方法 *...
- 轉(zhuǎn)載請注明來源 賴賴的博客 前景概要 在 01 走進Spring,Context筛武、Bean和IoC 中缝其,我們看到了...
- 章節(jié)目錄 原子操作含義 相關(guān)術(shù)語 保證多處理器操作原子性的兩種方式 Java語言層面上實現(xiàn)原子操作 原子操作的含義...