Java基于堆結(jié)構(gòu)實(shí)現(xiàn)優(yōu)先隊(duì)列功能示例
本文實(shí)例講述了Java基于堆結(jié)構(gòu)實(shí)現(xiàn)優(yōu)先隊(duì)列功能。分享給大家供大家參考,具體如下:
package Demo; import java.util.NoSuchElementException; /* * 小頂堆 java使用堆結(jié)構(gòu)實(shí)現(xiàn)優(yōu)先隊(duì)列 */ public class JPriorityQueue<E> { @SuppressWarnings("hiding") class QueueNode<E> { int capacity; int size; E[] queue; QueueNode(int capacity) { this.capacity = capacity; } } QueueNode<E> node; public void print() { E[] objs=this.node.queue; for(int i=0;i<this.node.size;i++) { System.out.print(objs[i]+" "); } System.out.println(); } @SuppressWarnings("unchecked") public JPriorityQueue(int capacity) { node = new QueueNode<E>(capacity); node.size = 0; node.queue = (E[]) new Object[capacity + 1]; } public void add(E x) { int k = node.size; while (k > 0) { int parent = (k - 1) / 2; E data = node.queue[parent]; @SuppressWarnings({ "unchecked", "rawtypes" }) Comparable<E> key = (Comparable) x; if (key.compareTo(data) >= 0) break; node.queue[k] = data; k = parent; } node.queue[k] = x; node.size++; } public E remove() { int parent = 0; if (node.size == 0) { throw new NoSuchElementException("queue is null"); } E min = node.queue[0];// top E last = node.queue[node.size - 1];// last node.queue[0] = last;// add the last to top node.queue[node.size - 1] = null; node.size--; @SuppressWarnings("unchecked") Comparable<? super E> complast = (Comparable<? super E>) last; if (node.size == 2 && complast.compareTo(node.queue[1]) > 0) { // 只剩下最后兩個(gè)結(jié)點(diǎn),進(jìn)行比較 node.queue[0] = node.queue[1]; node.queue[1] = last; } if (node.size > 2) { // 大于三個(gè)結(jié)點(diǎn)的,向下旋轉(zhuǎn) while (parent < node.size / 2) { int left = 2 * parent + 1;// left child int right = left + 1;// right child E root = node.queue[parent]; @SuppressWarnings("unchecked") Comparable<? super E> comproot = (Comparable<? super E>) root; if (comproot.compareTo(node.queue[left]) < 0 && comproot.compareTo(node.queue[right]) < 0) break; @SuppressWarnings("unchecked") Comparable<? super E> compleft = (Comparable<? super E>) node.queue[left]; if (compleft.compareTo(node.queue[right]) <= 0) { node.queue[parent] = node.queue[left]; node.queue[left] = root; parent = left; } else { node.queue[parent] = node.queue[right]; node.queue[right] = root; parent = right; } if (right * 2 >= node.size) break; } } return min; } public static void main(String[] args) { System.out.println("腳本之家測試結(jié)果:"); JPriorityQueue<String> queue = new JPriorityQueue<String>(10); queue.add("Z"); queue.add("B"); queue.add("QZA"); queue.add("QBA"); queue.add("EAA"); queue.add("A"); queue.print(); // queue.remove(); // queue.remove(); // queue.remove(); // queue.remove(); // queue.remove(); System.out.println(queue.remove()); System.out.println(queue.remove()); System.out.println(queue.remove()); System.out.println(queue.remove()); System.out.println(queue.remove()); System.out.println(queue.remove()); } }
運(yùn)行結(jié)果:
更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計(jì)有所幫助。
- Java數(shù)據(jù)結(jié)構(gòu)之堆(優(yōu)先隊(duì)列)的實(shí)現(xiàn)
- Java優(yōu)先隊(duì)列?priority?queue
- java數(shù)據(jù)結(jié)構(gòu)-堆實(shí)現(xiàn)優(yōu)先隊(duì)列
- Java優(yōu)先隊(duì)列(PriorityQueue)重寫compare操作
- java優(yōu)先隊(duì)列PriorityQueue中Comparator的用法詳解
- Java的優(yōu)先隊(duì)列PriorityQueue原理及實(shí)例分析
- java編程實(shí)現(xiàn)優(yōu)先隊(duì)列的二叉堆代碼分享
- Java數(shù)據(jù)結(jié)構(gòu)優(yōu)先隊(duì)列實(shí)練
相關(guān)文章
spring?boot學(xué)習(xí)筆記之操作ActiveMQ指南
ActiveMQ是一種開源的基于JMS規(guī)范的一種消息中間件的實(shí)現(xiàn),ActiveMQ的設(shè)計(jì)目標(biāo)是提供標(biāo)準(zhǔn)的,面向消息的,能夠跨越多語言和多系統(tǒng)的應(yīng)用集成消息通信中間件,這篇文章主要給大家介紹了關(guān)于spring?boot學(xué)習(xí)筆記之操作ActiveMQ指南的相關(guān)資料,需要的朋友可以參考下2021-11-11SpringBoot中時(shí)間類型 序列化、反序列化、格式處理示例代碼
這篇文章主要介紹了SpringBoot中時(shí)間類型 序列化、反序列化、格式處理示例代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08SpringBoot的服務(wù)注冊與發(fā)現(xiàn)示例
本篇文章主要介紹了SpringBoot的服務(wù)注冊與發(fā)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05Maven項(xiàng)目web多圖片上傳及格式驗(yàn)證的實(shí)現(xiàn)
本文主要介紹了Maven項(xiàng)目web多圖片上傳及格式驗(yàn)證的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10SpringBoot實(shí)現(xiàn)各種參數(shù)校驗(yàn)總結(jié)(建議收藏!)
本文深入解析了Spring?Validation的使用方法、實(shí)現(xiàn)原理及最佳實(shí)踐,詳細(xì)介紹了各種參數(shù)校驗(yàn)場景,如requestBody和requestParam/PathVariable的使用,并探討了分組校驗(yàn)、嵌套校驗(yàn)和自定義校驗(yàn)的高級應(yīng)用,需要的朋友可以參考下2024-09-09Java Jackson之ObjectMapper常用用法總結(jié)
這篇文章主要給大家介紹了關(guān)于Java Jackson之ObjectMapper常用用法的相關(guān)資料,ObjectMapper是一個(gè)Java庫,用于將JSON字符串轉(zhuǎn)換為Java對象或?qū)ava對象轉(zhuǎn)換為JSON字符串,需要的朋友可以參考下2024-01-01