堆是一棵完全二叉树,所谓的完全二叉树的意思是所有的叶子节点都处于某一层,或者处于两个相邻的层并且最底层的叶子节点处于最左侧。但是堆具有的一个特殊性质是:每个节点上的值都小于(大于)或等于那个节点上的值。
下面的代码是以小于为实现。堆可以做为一个优先队列的实现,可以成为一种排序方式。
public class Heap<E extends Comparable<E>> {
private E[] data=(E[])new Object[10]; //用数组实现
int top=-1; //用来指向元素存到数组哪个位置了
public Heap(){
}
public Heap(Collection<E> coll){
for(E e:coll){
add(e);
}
}
public Heap(E[] coll){
for(E e:coll){
add(e);
}
}
//判断是否为空树
public boolean isEmpty(){
return top==-1;
}
//返回index的左子树位置
private int leftChildIndex(int index){
return 2*index+1;
}
//返回index的右子树位置
private int rightChildIndex(int index){
return 2*index+2;
}
//返回index的父亲位置
private int parentChildIndex(int index){
return (index-1)/2;
}
//实现加入操作
public void add(E target){
//判断是否超出数组大小,如果超出重新创建一个并复制原来的数组到新数组中
if(top==data.length-1){
E[] tempdata=(E[])new Object[data.length+5];
int j=0;
for(int i=0;i<data.length;i++){
tempdata[j++]=data[i];
}
data=tempdata;
}
//以下操作是真正加入到堆中
top=top+1; //指针下移
data[top]=target; //加入到末尾
//加入后可能出现不是堆了,进行堆化操作
int index=top;
int parent=parentChildIndex(index);
while(parent>=0){
//如果父亲比孩子节点大,交换位置
if(data[parent].compareTo(data[index])>0){
swap(parent,index);
index=parent;
parent=parentChildIndex(index);
}else{
return ;
}
}
}
//删除操作
public E remove(){
E temp=data[0]; //删除第一个
data[0]=data[top];//把最尾部的元素来取代这个位置
top--;
//以下是进行堆化操作
int index=0;
int leftchild=leftChildIndex(index);
int rightchild=rightChildIndex(index);
//只要孩子节点没超出执行以下操作
//如果当前节点比孩子节点大(如果都比两个大那么跟其中小)跟其交换
while(leftchild<=top||rightchild<=top){
if((data[index].compareTo(data[leftchild])>0)&&(data[leftchild].compareTo(data[rightchild])<0)){
swap(index,leftchild);
index=leftchild;
leftchild=leftChildIndex(index);
rightchild=rightChildIndex(index);
}else if(data[index].compareTo(data[rightchild])>0){
swap(index,rightchild);
index=rightchild;
leftchild=leftChildIndex(index);
rightchild=rightChildIndex(index);
}else{
break;
}
}
return temp;
}
//交换位置i,j位置元素
private void swap(int i,int j){
E temp=null;
temp=data[i];
data[i]=data[j];
data[j]=temp;
}
}
分享到:
相关推荐
用堆实现优先队列是排序方法的一种,这是是用堆实现优先队列的源代码!
本资源是数据结构中利用最小堆实现哈夫曼树的一个C++代码,仅供参考,欢迎指正
利用堆实现的优先队列实质是一棵顺序存储的二叉树!所以具有很好的时间"空间性能!比传统的优先队列具有更广泛的应用前景!可在计算机的各种排队算法中推广应用
c++ 最小堆 还不错 标准库没有 自己做作业用。
C++实现面向对象的堆排序和用堆实现的优先队列 Heap.vsd是类图,heap_test.cpp中是使用方法,把被我关掉的#if 0打开就能用了。 自己写的,做成了utility,挺好用的,先前用装饰模式做的,后来将其解耦,现在变得...
数据结构课设——小大根交替堆实现的双端优先级队列及应用
C++ 内存池私有堆 实现 测试代码 私有堆管理类 1. CPrivateHeap: 自动创建和销毁进程私有堆 每一个该类的对象都代表一个私有堆, 所以该类对象的特点是: 一般声明周期都比较长 通常作为全局对象, 其他类的静态成员...
由两部分组成,my_map.cpp用OpenCV实现读取地图等图像处理操作,main.cpp实现A*算法。二叉堆为类,格子为结构体。生成结果后进行优化,使原本只能走8个方向的结果优化为任意角度和方向,也就是真正的全局最短路径。
poj2823 最大最小堆实现,话说这题为啥要用最大最小堆。
C++实现面向对象的堆排序和用堆实现的优先队列 Heap.vsd是类图,heap_test.cpp中是使用方法,把被我关掉的#if 0打开就能用了。 自己写的,做成了utility,挺好用的,先前用装饰模式做的,后来将其解耦,现在变得...
c++描述的数据结构算法中的prim最小生成树的算法,利用最小堆来实现时间复杂度为O(elog2e)大家多多支持哦!!!
这是一个关于最小堆实现的程序的代码啊啊啊
输入文件“input.txt”,路径定义在项目默认:Visual Studio 2010\Projects\Poject1\Poject1 以“Huffman”编码对输入进行压缩编码 输出霍夫曼树的结构 输出编码结果、译码结果
基于堆实现Dijkstra算法C语言实现。。。。。。。。。。。。。。。
C++斜堆实现
NULL 博文链接:https://java--hhf.iteye.com/blog/2163480
NULL 博文链接:https://128kj.iteye.com/blog/1729190
山东大学数据结构课程设计-小大根交替堆实现双端优先队列,并运用于学生成绩的查询
C++左式堆实现