java使用堆结构实现优先队列
2015-05-30 17:07
806 查看
package com.structures.tree; import java.util.NoSuchElementException; /* * 小顶堆 java使用堆结构实现优先队列 * http://www.oschina.net/code/snippet_855019_15069 */ public class JPriorityQueue<E> { 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(); } 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]; 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--; Comparable<? super E> complast = (Comparable<? super E>) last; if (node.size == 2 && complast.compareTo(node.queue[1]) > 0) { // 只剩下最后两个结点,进行比较 node.queue[0] = node.queue[1]; node.queue[1] = last; } if (node.size > 2) { // 大于三个结点的,向下旋转 while (parent < node.size / 2) { int left = 2 * parent + 1;// left child int right = left + 1;// right child E root = node.queue[parent]; Comparable<? super E> comproot = (Comparable<? super E>) root; if (comproot.compareTo(node.queue[left]) < 0 && comproot.compareTo(node.queue[right]) < 0) break; 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) { 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()); } }
相关文章推荐
- Jsp+Servlet+JavaBean简单mvc实例
- java实现单词搜索迷宫游戏
- MyEclipse默认标签TODO,XXX,FIXME和自定义标签的使用
- java递归法求字符串逆序
- Java集合框架
- java集合及分类
- Spring-DI
- java多线程解决生产者消费者问题
- JVM如何理解Java泛型类(转)
- Java使用Comparable解决排序问题
- java实现堆排
- java初学。加载图片
- Java基础——IO(二)——File类、Properties类、打印流、序列流(合并流)
- eclipse 错误 R.java was removed! Recreating R.java!
- Hbase的java接口
- java几种排序算法的实现及简单分析
- Java编程思想之-反证法
- java实现快速排序的方法
- 新手用STS(Spring Tool Suite)和Maven构建一个SpringMVC项目
- 【精神哥讲Crash】第二期:java.lang.NoSuchMethodError