大顶堆的基本操作

server/2024/11/14 1:43:41/

目录

堆的基本操作

//堆排序


堆的基本操作


​​​​​
* 1.找到最后一个非叶子节点
* 2.从后向前遍历,对每个节点执行下潜操作

删除堆顶元素
* 1.将堆顶元素与最后一个元素交换位置
* 2.将最后一个元素删除
* 3.然后从上向下调整堆
 

public class MaxHeap {int [] array;int size;public MaxHeap(int capacity){array=new int[capacity];}public MaxHeap(int []array){this.array=array;size=array.length;heapify();}//建堆  把数组调整为大顶堆的形式private void heapify(){//找到最后一个非叶子节点  size/2-1 (size是从零开始计数)for(int i=size/2-1;i>=0;i--){down(i);}}//parent是下潜的元素,与两个子节点比较,如果比子节点大,则交换,然后继续下潜private void down(int parent) {int left=2*parent+1;int right=2*parent+2;int max=parent;if(left<size&&array[left]>array[max]){//left<size 是为了防止越界,在索引有意义的范围内进行比较max=left;}if(right<size&&array[right]>array[max]){max=right;}if(max!=parent){swap(max,parent);down(max);}}
//交换位置private void swap(int i, int j) {int temp=array[i];array[i]=array[j];array[j]=temp;}//获取堆顶元素public int peek(){if(size==0){return Integer.MIN_VALUE;}return array[0];}//删除堆顶元素public int poll(){if(size==0){return Integer.MIN_VALUE;}int result=array[0];swap(0,--size);down(0);array[size]=0;return result;}//删除指定元素public int poll(int index){int delete=array[index];swap(index,--size);down(index);array[size]=0;return delete;}//替换堆顶元素public void replace(int value){array[0]=value;down(0);}//堆的尾部添加元素public boolean offer(int value){if(size==array.length){return false;}up(value);size++;return true;}private void up(int value) {int child = size;while(child>0){int parent=(child-1)/2;if(array[parent]<value){array[child]=array[parent];child=parent;}else{break;}}array[child]=value;  //进入不了循环的在这进行插入}
}

//堆排序


/*
* 1.heapify()建立大顶堆
* 2.将堆顶与堆底的元素交换位置,缩小并下潜调整堆
* 3.重复2,3直到堆剩一个元素
* */

public class MaxHeapDemo1 {int [] array;int size;public MaxHeapDemo1(int capacity){array=new int[capacity];}public MaxHeapDemo1(int []array){this.array=array;size=array.length;heapify();}//建堆private void heapify(){for(int i=size/2-1;i>=0;i--){down(i);}}//下潜private void down(int parent){int left=2*parent+1;int right=2*parent+2;int max=parent;if(left<size&&array[left]>array[max]){max=left;}if(right<size&&array[right]>array[max]){max=right;}if(max!=parent){swap(max,parent);down(max);}}//交换private void swap(int i,int j){int temp=array[i];array[i]=array[j];array[j]=temp;}public String toString(){return Arrays.toString(array);}
}


http://www.ppmy.cn/server/141327.html

相关文章

脑科学 -- 认知锻炼方法

认知锻炼方法 认知锻炼旨在保持大脑活跃、增强认知功能&#xff0c;并预防衰老过程中的认知退化。以下是几种常见的认知锻炼方式&#xff1a; 1. 阅读与写作 每天阅读书籍、报纸或杂志&#xff0c;有助于增加词汇量、扩展知识面&#xff0c;并激活大脑多个区域。定期写日记、…

【随机种子】Random Seed是什么?

Random Seed是什么&#xff1f; 随机种子&#xff08;Random Seed&#xff09;就是这些随机数的初始值。 一般计算机里面产生的随机数都是伪随机数。 伪随机数&#xff0c;也是就一个一直不变的数。 import numpy as np# 不设置seed&#xff1a;每次运行结果都不同 random_numb…

【动态规划-划分型 DP】力扣2369. 检查数组是否存在有效划分

给你一个下标从 0 开始的整数数组 nums &#xff0c;你必须将数组划分为一个或多个 连续 子数组。 如果获得的这些子数组中每个都能满足下述条件 之一 &#xff0c;则可以称其为数组的一种 有效 划分&#xff1a; 子数组 恰 由 2 个相等元素组成&#xff0c;例如&#xff0c;…

如何利用静态住宅IP提升TikTok营销效果:应对平台限制与账号安全的新利器

随着TikTok的全球化和日益严苛的运营政策&#xff0c;越来越多的品牌和商家开始面临着平台地域限制、账户管理及内容推广的挑战。特别是在多个账户管理和跨境营销中&#xff0c;如何避免账号封禁、提高内容曝光&#xff0c;成为了亟待解决的问题。在这种背景下&#xff0c;代理…

Pure Adminrelease(水滴框架配置)

Pure Admin 保姆级文档&#xff08;已兼容最新版v5.8.0&#xff09; 1.如果您还没安装 pnpm&#xff0c;请执行下面命令进行安装 npm install -g pnpm 2.安装依赖 pnpm install 3.启动 pnpm dev 登录背景图片的修改 修改登录验证规则(只留了为空提示&#xff0c;我是把这文…

游戏引擎学习第四天

视频参考:https://www.bilibili.com/video/BV1aDmqYnEnc/ BitBlt 是 Windows GDI&#xff08;图形设备接口&#xff09;中的一个函数&#xff0c;用于在设备上下文&#xff08;device context, DC&#xff09;之间复制位图数据。BitBlt 的主要用途是将一个图像区域从一个地方复…

好算法的特性

【课堂笔记】 ### 课堂笔记&#xff1a;好算法的特性 1. **正确性**&#xff1a; - 符合语法要求&#xff0c;能够编译和链接。 - 能够正确处理各种类型的输入&#xff0c;包括&#xff1a; - 简单的输入。 - 大规模的输入。 - 一般性的输入。 - 退…

vue中如何关闭eslint检测?

ESLint作为一个用于JavaScript代码的验证工具&#xff0c;主要用于检查代码语法和编码规范。本文旨在指导那些希望在Vue.js项目中禁用ESLint验证功能的用户。对于需要这一操作的朋友&#xff0c;以下内容将提供参考。 vue中如何关闭eslint检测&#xff1f; 有了eslint的校验&…