首页 > 其他分享 >堆的使用

堆的使用

时间:2022-09-07 10:45:42浏览次数:33  
标签:parent int 使用 usedsize elem child public

  堆

分为大根堆和小根堆

child=2*parent+1

parent=(child-1)/2

 

创建大根堆

  public int[]elem;
    public int usedsize;

    public TestHeap(){
        int[] elem=new int[10];
    }

    public void heapCreat(int[] arr){
        for (int i = 0; i < arr.length; i++) {
            elem[i] = arr[i];
            usedsize++;
        }
        int parent=((usedsize-1)-1)/2;
        for (; parent >=0 ; parent--) {
            shiftDown(usedsize,parent);
        }
    }

 

向下调整(为了使每个根成为最大,调整后使parent=child查看是否有没有调整的)

public void shiftDown( int len,int parent){
        int child=2*parent+1;
        while (child<len){
            if (elem[child]<elem[child+1] && child+1<len){
                child++;  //保证左右孩子的最大值下标
            }
            if (elem[child]>elem[parent]){
                int tmp=elem[child];
                elem[child]=elem[parent];
                elem[parent]=tmp;
                parent=child;
                child=2*parent+1;

            }else {
                break;
            }
        }

    }

 

向上调整(将一个元素先放到usedsize-1的位置然后开始比较,如果大了就换)

 public void offer(int val){
        if (isFull()){
            elem= Arrays.copyOf(elem,2*elem.length);
        }
        elem[usedsize++]=val;
        shiftUp(usedsize-1); //注意这里的传参容易出错
    }
    public void shiftUp(int child) {
        int parent=(child-1)/2;
        while (child>0){
                if (elem[child]>elem[parent]){
                    int tmp=elem[child];
                    elem[child]=elem[parent];
                    elem[parent]=tmp;
                    child=parent;
                    parent=(child-1)/2;

                }else {
                    break;
                }

        }
    }
public boolean isFull(){
return usedsize==elem.length;
}
 

 

 

出队(出队使0下标的位置和最后一个位置进行交换,然后usedsize要--)

 public int poll(){
        if (ifempty()){
            throw new RuntimeException("优先为空");
        }
        int tmp=elem[0];
        elem[0]=elem[usedsize-1];
        elem[usedsize-1]=tmp;
        usedsize--;
        shiftDown(usedsize,0);
        return tmp;


    }

 

返回队首元素(直接返回数组0下标)

  public boolean ifempty(){
        return usedsize==0;
    }
    //返回队首元素
    public int  peek(){
        if (ifempty()){
            throw new RuntimeException("优先为空");
        }
        return elem[0];
    }

 

标签:parent,int,使用,usedsize,elem,child,public
From: https://www.cnblogs.com/lbwboke/p/16664477.html

相关文章

  • 嵌入式环境中使用git记录
    前提在已经下载好git的下.1.先获取ssh密钥,要注意的是,嵌入式开发中通常是交叉编译环境,会用samba,将window下的目录映射进入虚拟机中,而使用window的terminal终产生的ssh密......
  • 使用 React Native 在 5 天内构建您的移动应用程序
    使用ReactNative在5天内构建您的移动应用程序5天内使用ReactNative开发功能齐全的移动应用在数字化时代,开发移动应用程序已成为当务之急。在最短的时间内推出......
  • 让我们学习,如何使用 python 创建自己的端口扫描器
    让我们学习,如何使用python创建自己的端口扫描器PortScannerPythonPicture本教程仅包含用于创建端口扫描器的四个不同代码片段。这些端口扫描器将为Web服务和外部......
  • 河北稳控科技使用标准信号检测 VM振弦采集模块测量精度(三)
    河北稳控科技使用标准信号检测VM振弦采集模块测量精度(三) 频率与温度的多项式修正VM振弦采集模块自SF3.51版本开始,新增加了频率和温度的多项式修正功能。测量、计算......
  • codeblock下使用sdl
    ##1安装codeblock下载codeblock并安装,在codeblocks-20.03上没有成功。建议使用codeblocks-16.01mingw-setup.exe,##2下载SDL开发库将include文件夹和lib文件夹复制到d盘的......
  • 使用二进制编译安装lamp (centos)
    #1.Mysql-5.6.40软件包存放目录:```/usr/local/src/```###1.1安装mysql```shellcd/usr/local/src/#1.切换到软件包目录wgethttp://.....#2.获取php5.6.40源码包......
  • 如何使用 cloudflare 快速搭建个人域名邮箱 All In One
    如何使用cloudflare快速搭建个人域名邮箱AllInOnecustomdomainemailaddresscloudflare电子邮件电子邮件路由为您的域创建自定义电子邮件地址并将传入电子......
  • vivado使用
    Verilog 包括:源文件、ip核、综合、仿真(testbench)常用文件和名词 设计文件后缀:.v/.vhd 网表文件后缀:.edn约束文件后缀:.xdc检查点(checkpoint)文件后缀:.dcp 网......
  • 如何仅使用绑定将 Blob 从 Azure 存储帐户复制到另一个具有 Blob 触发功能的帐户
    如何仅使用绑定将Blob从Azure存储帐户复制到另一个具有Blob触发功能的帐户在本文中,我们将介绍一个Azure函数,该函数在源容器中创建新blob时触发,并在输出绑定的......
  • 使用 Azure 应用服务部署 React App
    使用Azure应用服务部署ReactApp大家好,今天我们将讨论如何将生产就绪的React应用程序部署到Azure云。对于今天的任务,如果您没有帐户,我们需要创建一个azure帐户和......