数据结构实战java实现二叉堆
来源:互联网 发布:sql 查询列重复的数据 编辑:程序博客网 时间:2024/06/10 10:41
什么是堆
堆是一颗完全被填满的二叉树
形如这样的
而这样则不是完全二叉树
堆序性质
每个节点都要的节点值都要大于(小于)子树的值。
顺序实现特点
对于除0位置以外的,位置i,它的左子为2i,右子为2i+1。父亲为 i/2.
具体实现
排序原理
插入原理
上滤,在下一个位置上创建一个空位,插入值于空位的父亲值对比,若插入值较小,于父亲值交换位置。
删除原理
下滤,将第一个值删去,将最后一个位置的值放在第一个位置,将此值的左,右孩子值比较较小的于此值交换位置,直到到叶子停止。
二叉堆得作用
- 排序
- 事件模拟
public class MyBinaryHeap<AnyType extends Comparable< ? super AnyType>> { public MyBinaryHeap( ) { clear(DEFAULT_CAPACITY); } public void clear( int capacity ) { array = (AnyType []) new Comparable[capacity]; } //使用上滤,这种方法插入值 public void insert(AnyType value ) { if( currentSize == array.length - 1) enlargeArray( array.length * 2 + 1); int hole = ++currentSize; for ( ; hole > 1 && value.compareTo(array[hole /2]) < 0; hole /= 2) array[hole] = array[ hole/2]; array[ hole] = value; } //返回最小值 public AnyType findMin() { return array[1]; } public boolean isEmpty() { return currentSize == 0; } public AnyType deleteMin() { try { if (isEmpty() ) throw new UnderflowException("二叉堆为空"); } catch(UnderflowException e) { System.out.println(e); } AnyType minItem = findMin(); array[1] = array[ currentSize--]; percolateDown( 1 ); return minItem; } public void makeEmpty() { array = (AnyType []) new Comparable[1]; } private static final int DEFAULT_CAPACITY = 10; private int currentSize; private AnyType [] array; // 使用下潜法将大值放下去,小值放上来。 private void percolateDown( int hole) { int child; AnyType temp = array[ hole ]; for ( ; hole * 2 <= currentSize; hole = child) { child = hole * 2; if ( child != currentSize && array[child + 1].compareTo(array[child]) < 0) child++; if ( array[child].compareTo(temp) < 0) array[hole] = array[child]; else break; } array[hole] = temp; } private void enlargeArray( int newSize ) { AnyType [] newarray; newarray= (AnyType[]) new Comparable[ newSize ]; int i = 0; for ( AnyType item : array) newarray[ i++] = item; array = newarray; } }
测试代码
public static void main(String[] args) { MyBinaryHeap test = new MyBinaryHeap(); test.insert(4); test.insert(3); test.insert(2); test.insert(1); test.deleteMin(); System.out.println(test.findMin()); }
测试结果
2
阅读全文
0 0
- 数据结构实战java实现二叉堆
- 《数据结构实战》------------------------ 一个二叉堆的实现
- 数据结构实战java实现二叉查找树
- 数据结构 二叉堆 数组实现
- 数据结构之优先队列--二叉堆(Java实现)
- 数据结构之优先队列--二叉堆(Java实现)
- 数据结构二叉堆C++实现 最小堆
- Java实现二叉堆创建
- 二叉堆(JAVA实现)
- 数据结构基础 之 二叉堆实现堆排序
- 堆这种数据结构 Java实现
- java实现最大堆数据结构
- 数据结构:堆的java实现
- 数据结构-堆的java实现
- 数据结构实战java实现栈
- 数据结构实战java实现队列
- 【数据结构】二叉堆(堆)
- 数据结构 二叉堆 & 堆排序
- java的一些重要问题
- LA 2038 Strategic game
- [Lintcode] #112 删除排序链表中的重复元素
- POJ2676-Sudoku
- C++ GUI Programming with Qt4 Second Edition 之 附录A.2 Windows系统Qt的安装
- 数据结构实战java实现二叉堆
- tp3.2中配置链接多个数据库
- LeetCode.217(219) Contains Duplicate && II
- Android基站定位详解
- Android--(13)--Android自定义实现actionbar实现微信标题栏
- ExtJs常用布局--layout详解(含实例)
- Failed to start A high performance web server and a reverse proxy server 错误提示
- [DeeplearningAI笔记]改善深层神经网络1.4_1.8深度学习实用层面_正则化Regularization与改善过拟合
- 重写UINavigationController实现滑动返回