类别:特征名词定义实用课文:1.定义:堆(heap)是计算机科学中一种特殊类型数据结构的总称。堆通常是一组对象,可以被认为是一棵树。n个元素的序列{k1,k2,ki,...,kn}被称为堆当且仅当它满足以下关系。(ki<=k2iandki<=k2i+1)or(ki>=k2iandki>=k2i+1)分析:本文使用数组实现堆,所以以数组为例:例如:数组[2,1,3,4,5,6,7,8]可以看做是一个类似于完全二叉树的结构。根现在是2,但还不是堆,堆分为最大堆和最小堆。我们以最小堆为例,如果要把这个完全二叉树的数组变成一个堆,我们需要调整它,使其符合根<=左节点,根<=右节点。这里我们也分为两种调整。我们可以向上或向下调整。现在我们用向下调整的方法,从上往下调整,再往下调整只要都需要符合堆的性质,就可以得到最小堆[1,2,3,4,5,6,7,8];上面的定义和大体逻辑分析完了,下面我们就根据这个逻辑分析来做实际的代码,请耐心往下看2.特点:1.堆中某个结点的值总是不大于或不小于其父节点的值2.堆永远是一棵完全二叉树3.堆是非线性数据结构,相当于一维数组,有两个直接后继3.名词:最大堆/大根堆/大顶heap:Thesmallestheapwiththelargestrootnode/Smallrootheap/Smalltopheap:Thesmallestheapwiththerootnode4.实际操作:1.创建堆接口类:/***堆接口类*应用场景:*优先队列*取最大值/最小值*@authorgxw*@date2021/11/421:58晚上*/publicinterfaceHeap{//建堆方法voidbuildHeap(int[]arr);//添加元素voidadd(intg);//替换元素,将第i个位置的元素值替换为gvoidreplace(inti,intg);//删除顶部元素booleanpop();//对堆进行排序voidshift_up(intnow);//对堆进行排序voidshit_down(intnow);//获取最高值intgetTopValue();//显示堆voiddisplay();}2.创建最大堆实现类:/***最大堆,又称大堆,又称大顶堆*@authorgxw*@date2021/11/422:21pm*/公开课马xHeapimplementsHeap{//堆数组privateint[]heapArr;//堆汇总点privateintsize;//堆深度privateintdepth;//堆最大存储节点privateintmaxSize;publicMaxHeap(intmaxSize){这个.maxSize=maxSize;this.heapArr=newint[maxSize];}@OverridepublicvoidbuildHeap(int[]arr){if(arr==null&&arr.length<=0)返回;//构造最大堆for(intg:arr){add(g);}}@Overridepublicvoidadd(intg){//先判断堆是否满if(size==maxSize)return;//添加到堆的末尾heapArr[size]=g;//节点数增加1size++;//判断是否可以加树深度,if2^depth-1
