堆是一棵完全二叉树,所谓的完全二叉树的意思是所有的叶子节点都处于某一层,或者处于两个相邻的层并且最底层的叶子节点处于最左侧。但是堆具有的一个特殊性质是:每个节点上的值都小于(大于)或等于那个节点上的值。
下面的代码是以小于为实现。堆可以做为一个优先队列的实现,可以成为一种排序方式。
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;
}
}
分享到:
相关推荐
### 利用堆实现的优先队列 #### 引言 在计算机科学领域,优先队列是一种非常重要的数据结构,它被广泛应用于多种算法中,如任务调度、事件驱动模拟等场景。相比于传统队列,优先队列允许插入元素时指定一个优先级...
数据结构课设——小大根交替堆实现的双端优先级队列及应用 小大根交替堆是一种特殊的堆结构,它可以同时满足大根堆和小根堆的性质。在本文中,我们将对小大根交替堆实现的双端优先级队列进行详细的分析和设计。 ...
总结,用堆实现的优先队列在Java中是一种高效的数据结构,能够快速地获取和删除最高优先级的元素。通过分析PriorityQueue类和PQTest类的代码,我们可以深入了解堆的内部机制以及如何在实际应用中使用优先队列。
总结来说,这个C++程序通过最小堆实现了一个高效的Prim最小生成树算法,能够快速找到无向图的最小生成树,从而在大规模图数据中找到最优的边集合。在实际应用中,这种优化算法常用于网络设计、资源分配等需要最小化...
Java中的`PriorityQueue`默认采用的是最小堆实现。这种数据结构保证了队列头部的元素总是具有最小的优先级,从而支持快速地获取并移除最小元素。 `PriorityQueue`的常见操作包括: 1. **插入元素**(`add(E e)`):...
优先队列是一种特殊的数据结构,它允许我们按照...总的来说,这个压缩包提供了一个用C语言实现的基于堆的优先队列,包含了实现和测试的源码,以及使用说明,是学习和理解优先队列及其底层数据结构堆的一个实用资源。
本资源是数据结构中利用最小堆实现哈夫曼树的一个C++代码,仅供参考,欢迎指正
c++ 最小堆 还不错 标准库没有 自己做作业用。
C++实现面向对象的堆排序和用堆实现的优先队列 Heap.vsd是类图,heap_test.cpp中是使用方法,把被我关掉的#if 0打开就能用了。 自己写的,做成了utility,挺好用的,先前用装饰模式做的,后来将其解耦,现在变得...
总的来说,这个项目通过小大根交替堆实现的双端优先队列,结合学生信息,可以高效地处理学生成绩的查询、排序和管理,尤其是在需要快速获取最高分和最低分的情况下。这种数据结构的设计和实现对于学习数据结构和算法...
C++ 内存池私有堆 实现 测试代码 私有堆管理类 1. CPrivateHeap: 自动创建和销毁进程私有堆 每一个该类的对象都代表一个私有堆, 所以该类对象的特点是: 一般声明周期都比较长 通常作为全局对象, 其他类的静态成员...
**Treap树堆实现** Treap,又称为“随机优先搜索树”,是一种结合了二叉查找树(BST)和堆特性的数据结构。它在保持查找树特性的同时,通过引入随机化来保证平衡,从而避免了传统平衡二叉树如AVL或红黑树等在插入和...
poj2823 最大最小堆实现,话说这题为啥要用最大最小堆。
在给定的压缩包文件"C++二叉堆实现.zip"中,包含了两个文件:MyBinaryHeapTest.cpp 和 MyBinaryHeap.h。这表明这是一个C++项目,其中MyBinaryHeap.h文件可能定义了二叉堆类的接口,而MyBinaryHeapTest.cpp则实现了这...
斜堆(Skew Heap)是一种...总结来说,C++中的斜堆实现涉及数据结构的设计、节点的合并算法以及堆操作的实现。通过`MySkewHeapTest.cpp`和`MySkewHeap.h`这两个文件,我们可以深入理解斜堆的工作原理,并验证其正确性。
在这个案例中,我们讨论的是一个用堆实现的最大优先级队列。 `Max_priority.cpp` 和 `Max_priority.h` 是两个关键文件,分别包含了实现和声明。`Max_priority.h` 文件可能定义了一个名为 `Max_PriorityQueue` 的...
C++实现面向对象的堆排序和用堆实现的优先队列 Heap.vsd是类图,heap_test.cpp中是使用方法,把被我关掉的#if 0打开就能用了。 自己写的,做成了utility,挺好用的,先前用装饰模式做的,后来将其解耦,现在变得...
栈回溯技术及uClibc的堆实现原理 栈回溯技术是指通过分析栈中的信息,来定位程序中的错误,了解栈的作用和堆的实现原理,可以帮助我们更好地理解程序的运行机制和错误的定位。 栈是程序中最重要的数据结构之一,栈...
`PriorityQueue`类位于`java.util`包下,它基于优先级堆实现,不保证队列的顺序,但提供了高效的操作,如插入(offer)、删除最小元素(poll)和检查队首元素(peek)等。默认情况下,`PriorityQueue`不允许插入...