【数据结构】堆和二叉堆
1.什么是堆
堆是一棵具有特定性质的二叉树,堆的基本要求是堆中所有结点的值必须大于等于(或小于等于)其孩子结点的值,这也称为堆的性质。堆还有另一个性质,就是当h>0时,所有叶子结点都处于第h或h-1层,也就是说,堆应该是一棵完全二叉树。
2.堆的类型
最大堆:结点的值必须大于等于其孩子结点的值
最小堆:结点的值必须小于等于其孩子结点的值
3.二叉最大堆的实现
堆化元素
堆化是堆最重要的操作,当插入或删除堆的一个元素时,有可能使堆不满足堆的性质,在这种情况下,需要调整堆中元素的位置使之重新变为堆,这个过程叫做堆化。在最大堆中,要堆化一个元素,需要找到它的孩子结点中的最大值,然后将它与当前元素交换,重复该过程直至每个结点都满足堆的性质为止。
Java版本实现
package com.wuyi.notecode.sort;public class Heap {public int[] nums;public int count;//堆中元素个数public int size;//堆的大小public Heap(int size ) {this.size = size;count = 0;nums = new int[size];}//获取父节点public int Parent(int i) {if(i <= 0 || i > this.count)return -1;return( i - 1 ) / 2;}//获取左孩子public int LeftChild(int i) {int l = 2 * i +1;if(l <= 0 || l > this.count - 1)return -1;return l;}//获取右孩子public int RightChild(int i) {int r = 2 * i +2;if(r <= 0 || r > this.count - 1)return -1;return r;}//获取最大值public int GetMax() {if(this.count == 0)return -1;return this.nums[0];}//堆化元素,向下渗透public void PrecolateDown(int k) {//非递归实现while (2 * k < count) {int j = 2 * k + 1;if (j < count - 1 && nums[j] < nums[j + 1])j++;if (j > count - 1 || nums[k] >= nums[j])break;swap(nums, j, k);k = j;}}private void swap(int[] nums, int j, int k) {int temp = this.nums[j];this.nums[j] = this.nums[k];this.nums[k] = temp;}//删除元素,时间复杂度O(logn)public int remove() {if(count == 0)return -1;int temp = nums[0];nums[0] = nums[--count];PrecolateDown(0);return temp;}//插入元素,时间复杂度O(logn)public void insert(int data) {if(count == 0) {nums[0] = data;return;}if(count == size) {ReSizeHeap();}count++;int i = count - 1;while(i > 0 && data > nums[( i - 1) / 2]) {nums[i] = nums[(i - 1) / 2];i = (i - 1) / 2;}nums[i] = data;}private void ReSizeHeap() {int[] newA = new int[size * 2];System.arraycopy(nums, 0, newA, 0, size);size = size * 2;nums = newA;newA = null;}//清空堆public void DestroyHeap() {count = 0;nums = null;}//数组建堆void BuildHeap(int a[] , int n) {if(size == 0)return;while( n > size) {ReSizeHeap();}for(int i = 0 ; i < n ; i++)this.nums[i] = a[i];count = n;for(int i = count / 2 ; i >= 0 ; i--) {PrecolateDown(i);}}//打印堆元素public void display() {for(int i = 0 ; i < count; i++)System.out.print(nums[i] + " ");System.out.println();}public static void main(String[] args) {int[] a = {12,2,3,4,11,6,7,8};Heap heap = new Heap(a.length);heap.BuildHeap(a, a.length);heap.display();heap.insert(15);heap.display();heap.remove();heap.display();heap.DestroyHeap();heap.display();}
}
【数据结构】堆和二叉堆相关推荐
- java 二叉堆_二叉堆的介绍和Java实现
一.堆和二叉堆 堆,英文名称Heap,所谓二叉堆(也有直接称二叉堆为堆的),本质上是一个完全二叉树,前面也提到过,如果树接近于完全二叉树或者满二叉树,采用顺序存储代价会小一点,因此常见的二叉堆均是顺序 ...
- java 二叉堆_二叉堆(三)之 Java的实现
概要 前面分别通过C和C++实现了二叉堆,本章给出二叉堆的Java版本.还是那句话,它们的原理一样,择其一了解即可. 二叉堆的介绍 二叉堆是完全二元树或者是近似完全二元树,按照数据的排列方式可以分为两 ...
- 二叉堆与二叉堆的构建
什么是二叉堆? 二叉堆本质上是一种完全二叉树,它分为两个类型: 最大堆:任何一个父节点的值,都大于或等于它左.右孩子节点的值. 最小堆:任何一个父节点的值,都小于或等于它左.右孩子节点的值. 二叉堆的 ...
- 堆化 二叉堆一般用数组来表示。typedef struct _minHeapNodetypedef struct _otherInfo-icoding-C-数据结构
堆化 二叉堆一般用数组来表示.例如,根节点在数组中的位置是0,第n个位置的子节点分别在2n+1和 2n+2. 因此,第0个位置的子节点在1和2,1的子节点在3和4.以此类推.这种存储方式便于寻找父节 ...
- 堆初始化-二叉堆一般用数组来表示。例如,根节点在数组中的位置是0,第n个位置的子节点分别在2n+1和 2n+2-icoding-void init_min_heap(PMinHeap pq, int
堆初始化 二叉堆一般用数组来表示.例如,根节点在数组中的位置是0,第n个位置的子节点分别在2n+1和 2n+2. 因此,第0个位置的子节点在1和2,1的子节点在3和4.以此类推.这种存储方式便于寻找 ...
- 数据结构之优先队列--二叉堆(Java实现)
前言 数据结构队列的学习中,我们知道队列是先进先出的.任务被提交到队列中,按照先进先出的原则 对各个任务进行处理.不过在现实的情况下,任务通常有着优先级的概念,例如短任务.管理员的操作 应该优先执行. ...
- java实现二叉堆,数据结构基础篇-二叉堆
二叉堆分为两种,最大堆和最小堆,我们只讨论最小堆的性质,最大堆具有相同的原理. 最小堆是一种符合下面两个特性的树形结构: 最小堆是一颗完全二叉树,即最小堆的每个节点要么没有子节点,要么只有一个左子节点 ...
- 数据结构与算法--二叉堆(最大堆,最小堆)实现及原理
二叉堆(最大堆,最小堆)实现及原理 二叉堆与二叉查找树一样,堆也有两个性质,即结构性质和堆性质.和AVL树一样,对堆的一次操作必须到堆的所有性质都被满足才能终止,也就是我们每次对堆的操作都必须对堆中的 ...
- 四叉堆 VS 二叉堆
转至: http://hi.baidu.com/iceboy_/home 转载于:https://www.cnblogs.com/Lipp/archive/2012/04/06/2435257.htm ...
最新文章
- cJsonFiles数据结构
- select into from 用法_年轻同事不讲武德,直接怼上MySQL常见SQL的七大错误用法
- boost::intrusive::derivation_value_traits用法的测试程序
- Vboxmanage改动uuid报错的解决的方法
- jsp实现网页的在线调查功能
- (35)System Verilog引用包中定义的类(成功)
- 自动输入命令执行_Ubuntu命令行操作-命令简介
- proxychains 一个好用的终端用代理拦截器
- shell 分割字符串_谈一谈Shell中的贪婪匹配和非贪婪匹配
- 迎接2019多校联合新生训练赛(2018/12/31)
- 阶段3 2.Spring_10.Spring中事务控制_1 基于XML的AOP实现事务控制
- 切比雪夫多项式(Chebyshev Polynomials)
- epoll的两种触发模式ET和LT
- photoshop PS 查看像素坐标、像素颜色、像素HSB颜色
- 特斯拉Model 3进化不止 传统车企到底应该学什么?
- 2015总结与新年计划
- 从零开始的Multi-armed Bandit
- win10专业版提示“许可证即将过期”怎么办?
- 选购云服务器时云盘该如何选择?(高性能/SSD/增强型/急速型)
- macOS app动态修改app图标,图标为icns格式