zoukankan      html  css  js  c++  java
  • 二叉堆实现


    /*
    ** 二叉堆的实现
    ** 堆最重要的性质是儿子的值大于等于父亲的值。除此之外。
    ** 树的节点是依照从上到下,从左到右的顺序紧凑排列的。

    ** ** 插入:首先在末尾插入,然后不断向上提升直到没有大小颠倒为止。 ** 删除:首先把堆的最后一个元素拷贝到根节点而且删除最后一个 ** 节点。

    然后不断向下交换直到没有大小颠倒为止。在向下交换过程 ** 中,假设有两个儿子,那么选择数值较小的儿子进行交换。

    */ #include <stdio.h> #include <string.h> #define maxn 1000 int heap[maxn], sz = 1; // 1为根节点 void push(int x) { int i = sz++; while(i > 1) { int p = i >> 1; // 父亲节点 if(heap[p] <= x) break; // 不再颠倒 heap[i] = heap[p]; // 把父亲节点放下,自己提上去 i = p; } heap[i] = x; } int top() { // ...须要先推断非空 return heap[1]; } int pop() { // 出队,同一时候返回队首元素 int ret = heap[1]; int x = heap[--sz]; // 要提到根的数值 int i = 1; while(i * 2 < sz) { int a = i << 1; b = i << 1 | 1; if(b < sz && heap[b] < heap[a]) a = b; if(heap[a] >= x) break; // 不再颠倒 heap[i] = heap[a]; // 把儿子的值提上来 i = a; } heap[i] = x; return ret; }



    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    jenkins:用jenkins通过ssh部署jar包到远程linux机器(jdk 15 / jenkins 2.257)
    linux(centos8):安装java jdk 15 (java 15)
    38. 外观数列 迭代
    58. 最后一个单词的长度
    kmp字符串匹配
    单词规律
    1502. 判断能否形成等差数列
    1496. 判断路径是否相交
    1475. 商品折扣后的最终价格
    一维数组的动态和
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4640817.html
Copyright © 2011-2022 走看看