堆,插入、删除、求堆顶

int pile[N];

int idx=1; // 下一个节点的位置

void exchange(int a,int b){

    int temp=pile[a];

    pile[a]=pile[b];

    pile[b]=temp;

}

堆插入,以大根堆为例,完全二叉树,用数组存储

1、插入节点成为最后一个叶子节点,从该节点开始向上调整,每次只需要比较当前节点与父节点,看是否需要交换。因为大根堆的性质,父节点比左、右儿子节点都大,若当前节点比父节点大,则子树中当前节点最大。递归调整,代码如下。

void up_adjust(int a){

    if(a>=2){

        int pa=a/2;

        if(pile[a]>pile[pa]){

            exchange(a,pa);

            up_adjust(pa);

        }

    }

}

2、删除根节点,将最后一个叶节点放到根节点处,递归向下调整,父节点与左、右儿子节点都要比较,代码如下:

void down_adjust(int pa){

    if(2*pa<idx && 2*pa+1<idx){

        if(pile[2*pa]>pile[2*pa+1]){

            if(pile[2*pa]>pile[pa]){

                exchange(pa,2*pa);

                down_adjust(2*pa);

            }

        }

        else{

            if(pile[2*pa+1]>pile[pa]){

                exchange(pa,2*pa+1);

                down_adjust(2*pa+1);

            }

        }

    }

    if(2*pa<idx && 2*pa+1>=idx){

        if(pile[2*pa]>pile[pa]){

            exchange(pa,2*pa);

            down_adjust(2*pa);

        }

    }

}

全部评论

相关推荐

rndguy:个人思路,抛砖引玉。 要我的话我先问清楚需求:要什么精度,什么速度,什么环境。 如果精度要求很低,平台也有点柔性的话,只需要输出pwm,然后开个中断记录各多少个脉冲,如果脉冲时间不对齐了就反馈控制电流加减就行。要求同步要求稍微高点的话可以在脉冲间做个线性插值,同步精度会高些。 但总体来说,如果直流有刷只有脉冲没有好的编码器的话很难做精准定位什么的(除非用一些电机磁路结构相关的奇技淫巧如高频注入什么的),所以要求更高就需要大量参数辨识和校准,那就慢多了。
点赞 评论 收藏
分享
09-18 20:41
门头沟学院 Java
要个offer怎么这...:哈哈哈哈哈哈,我也拿了0x10000000个offer,秋招温啦啦啦,好开心
我的秋招日记
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务