自己实现一个简单的优先队列-二叉堆
来源:互联网 发布:淘宝没有延长收货时间 编辑:程序博客网 时间:2024/04/29 14:20
需求
自己实现一个简单的优先队列(Priority Queue)-二叉堆(Binary Heap).
二叉堆是一种特殊的堆,二叉堆是完全二元树(二叉树)或者是近似完全二元树(二叉树)。二叉堆有两种:最大堆和最小堆。最大堆:父结点的键值总是大于或等于任何一个子节点的键值;最小堆:父结点的键值总是小于或等于任何一个子节点的键值。
接口
interface PriorityQueue<E extends Comparable<? super E>> { int size(); boolean isEmpty(); void add(E e); E findMin(); E deleteMin();}
实现类
import java.util.Arrays;import java.util.NoSuchElementException;class BinaryHeap<E extends Comparable<? super E>> implements PriorityQueue<E> { private static final int DEFAULT_CAPACITY = 10; private Object[] array; private int size; public BinaryHeap() { this(DEFAULT_CAPACITY); } public BinaryHeap(int size) { size = 0; array = new Object[size]; } public BinaryHeap(E[] arr) { size = arr.length; array = new Object[(size + 2) * 11 / 10]; int i = 1; for (E e : arr) { array[i++] = e; } buildHeap(); } @Override public int size() { return size; } @Override public boolean isEmpty() { return size == 0; } @Override public void add(E e) { if (size == array.length - 1) { enlargeCapacity(array.length * 2 + 1); } int h = ++size; for (array[0] = e; e.compareTo(array(h / 2)) < 0; h /= 2) { array[h] = array[h / 2]; } array[h] = e; } private void enlargeCapacity(int newCapacity) { array = Arrays.copyOf(array, newCapacity); } @Override public E findMin() { rangeCheck(); return array(1); } @Override public E deleteMin() { E min = findMin(); array[1] = array[size--]; percolateDown(1); return min; } private void percolateDown(int h) { E e = array(h); int c; while (h * 2 <= size) { c = h * 2; if (c + 1 <= size && array(c + 1).compareTo(array(c)) < 0) { c++; } if (array(c).compareTo(e) < 0) { array[h] = array[c]; h = c; } else { break; } } array[h] = e; } private void buildHeap() { for (int i = size / 2; i > 0; i--) { percolateDown(i); } } @SuppressWarnings("unchecked") private E array(int index) { return (E) array[index]; } private void rangeCheck() { if (size == 0) { throw new NoSuchElementException(); } }}
测试
PS
其实这里可以看到,按最小值输出的话,会把数据有序输出,堆排序就是用了这样的方法对数据进行排序的,大根堆与小根堆分别对应顺序排列和逆序排列。
阅读全文
0 0
- 自己实现一个简单的优先队列-二叉堆
- 优先队列的简单实现-二叉堆实现
- 优先队列的实现--二叉堆
- 优先队列的数组、二叉堆实现
- 优先队列--二叉堆实现
- 优先队列(堆)——二叉堆的实现
- 基于二叉堆实现的优先队列和堆排序
- 优先队列(二叉堆实现) + 堆排序
- 二叉堆的实现和详解(优先队列的基础)
- 自己写GoBinaryHead 二叉堆binaryheap实现优先队列(堆)
- 算法学习 - 优先队列的二叉堆实现
- 挑战程序设计竞赛 二叉堆(优先队列)的实现
- 优先队列的Java实现(最大二叉堆)
- 优先队列——二叉堆实现
- 优先队列二叉堆 C语言实现
- 用二叉堆实现优先队列
- 优先队列(利用二叉堆实现)
- 优先队列之二叉堆(JAVA实现)
- hibernateTemplate中常用查询方法的使用
- Shell字符串截取
- HDU
- java对象的作用域问题
- java ping IP 实现
- 自己实现一个简单的优先队列-二叉堆
- 每日一题(15)—— static有什么用途
- 小米拍照以及选取相册数据为空问题
- vmware12安装centos7 设置网络连接
- 长路
- (转)自然语言处理中的Attention Model:是什么及为什么
- nginx.conf 配置补充
- 在Emacs中预览Markdown
- 彻底理解JS中this的指向