1.说明:是基于二叉树实现的2.时间复杂度操作时间复杂度EnqueueO(logn)DequeueO(logn)3.插入节点的浮动操作(为了让最大值放在最前面)(在代码siftUp方法中)4.最大节点弹出后,最小值下沉操作(代码siftDown方法中)5.代码data=$baseArray;返回$这个;}publicfunction__construct(){$this->data=newBaseArray();}/***获取堆的大小*@returnint*/publicfunctiongetSize():int{return$this->data->getSize();}/***获取父节点的索引*@paramint$index*@returnint*@throws\Exception*/publicfunctionparentIndex(int$index):int{if($index<=0){thrownew\Exception('索引必须大于0!');}返回($index-1)/2;}/***获取左孩子的索引*@paramint$index*@returnint*/publicfunctionleftChildIndex(int$index):int{return$index*2+1;}/***获取右孩子的索引*@paramint$index*@returnint*/publicfunctionrightChildIndex(int$index):int{return$index*2+2;}/***获取最大值*@returnstring|int|null*/publicfunctiongetMaxValue(){return$this->data->getSize()>0?$this->data->getFirst():空;}/***弹出堆中最大的元素*@returnint|string|null*@throws\Exception*/publicfunctionpopMaxValue(){//如果没有堆,就返回$maxValue=$this->获取最大值();如果(is_null($maxValue))返回null;$this->data->swap(0,$this->data->getSize()-1);$this->data->del($this->data->getSize()-1);//最小下沉$this->siftDown(0);返回$最大值;}/***添加数据*@param$value*@throws\Exception*/publicfunctionadd($value){//添加元素到数组的末尾$this->data->addLast($value);//获取最后一个索引并进行浮动操作$this->siftUp($this->data->getSize()-1);}/***浮点运算,将最大值浮到顶部*@paramint$index当前索引*@throws\Exception*/protectedfunctionsiftUp(int$index){//如果索引大于0且父节点的值小于当前节点的值,进入循环while($index>0&&bccomp($this->data->get($this->parentIndex($index)),$this->data->get($index))<0){//交换数组的索引下标$this->data->swap($index,$this->parentIndex($index));//将父节点的索引改为当前索引,继续循环$index=$this->parentIndex($index);}}/***下沉操作,设置最小值下沉到底部*@paramint$index*@throws\Exception*/protectedfunctionsiftDown(int$index){while($this->leftChildIndex($index)<$this->data->getSize()){//获取子节点的索引$childIndex=$this->leftChildIndex($index);//比较左右子节点的值,取最大值的节点索引赋给子节点索引if(bccomp($this->data->get($this->rightChildIndex($index)),$this->data->get($childIndex))>0){$childIndex=$this->rightChildIndex($index);}//比较节点值和子节点的值,如果比子节点大,不处理if(bccomp($this->data->get($index),$this->data->get($childIndex))>=0){中断;}//转置节点和子节点$this->data->swap($index,$childIndex);//分配$index=$childIndex;}}/***替换堆中的最大值*@param$newValue*@returnbool*@throws\Exception*/publicfunctionreplaceMaxValue($newValue):bool{$maxValue=$this->getMaxValue();如果(is_null($maxValue))返回false;$this->data->set(0,$newValue);$吨他的->筛选(0);返回真;}/***堆化*@throws\Exception*/publicfunctionheapify(){for($i=$this->data->getSize()-1;$i>=0;$i--){$this->siftDown($i);}}/***打印数据*@returnvoid*/publicfunctionvarDump():void{echo(string)$this->data.PHP_EOL;}}6.示例add($i);}for($i=0;$i<10;$i++){var_dump($heap->popMaxValue());}整数(9)整数(8)整数(7)整数(6)整数(5)整数(4)整数(3)整数(2)整数(1)整数(0)
