网站利于搜索,国外高清视频素材网站推荐,怎么用wordpress做网站,怎样审请网站算法流程#xff1a; 与⽗结点的权值作⽐较#xff0c;如果⽐它⼤#xff0c;就与⽗亲交换#xff1b; 交换完之后#xff0c;重复 1 操作#xff0c;直到⽐⽗亲⼩#xff0c;或者换到根节点的位置 大家可能会有点疑惑#xff0c;这个是大根堆#xff0c;22是怎么跑到… 算法流程 与⽗结点的权值作⽐较如果⽐它⼤就与⽗亲交换 交换完之后重复 1 操作直到⽐⽗亲⼩或者换到根节点的位置 大家可能会有点疑惑这个是大根堆22是怎么跑到上面的刚开始的时候都是大根堆比如22的位置原本是99是一个合法的大根堆我们在删除堆的元素的时候就会让小元素22跑到顶部因为删除堆顶元素的操作是堆尾本来有一个22堆顶元素是99我们要把99删掉就是拿99和22交换此时删除数组里面最后一个元素就是删除9922跑到上面的时候左右两边的子树都是一个合法的大根堆就是22不是平白无故爬上来的是在删除堆顶元素的时候跑上来的跑完之后左右子树全都是一个合法的堆此时我们在执行向下调整到算法才是有意义的如果22跑到上面的时候左右边的子树都不是一个合法的大根堆的话向下调整是没有意义的。
时间复杂度
最差情况下我会从根节点一直转移转移一个树的高度因此它的时间复杂度也是OlogN
代码实现
void down(int parent)//拿当前结点和孩子作比较
{int child parent * 2;//当孩子存在指向向下调整算法while (child n) //左孩子都不存在右孩子一定不存在{//找最大的孩子//存在右孩子并且右孩子大于左孩子,条件满足指向最大的孩子否则不作为if (child 1 n heap[child 1] heap[child]) child;if (heap[parent] heap[child]) return; //如果父节点大于孩子节点就不用调整了swap(heap[parent], heap[child]); //交换父子节点parent child; //父节点向下走child parent * 2; //孩子向下走}
}