当前位置: 首页 > news >正文

大顶堆的基本操作

目录

堆的基本操作

//堆排序


堆的基本操作


​​​​​
* 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.mrgr.cn/news/70456.html

相关文章:

  • vivado+modelsim: xxx is not a function name
  • 吃透红利!AI绘画变现方法汇总|变现方式:哪一种最适合你?方法加实践,小白也能上手赚钱!
  • 创新体验触手可及 紫光展锐携手影目科技推出AI眼镜开放平台
  • 软件测试基础二十一(接口测试 数据库相关)
  • 解决编译 fast-lio-lc 算法时遇到的error方法
  • 2023年09月中国电子学会青少年软件编程(Python)等级考试试卷(三级)答案 + 解析
  • 过程自动化的新黄金标准:Ethernet-APL
  • 多点支撑:滚珠导轨的均匀分布优势!
  • QT栅格布局的妙用
  • 【reflex】Python一种更直观和高效的方式来管理事件流模块
  • TCP最后一次握⼿连接阶段,如果ACK包丢失会怎样?
  • qt QWidgetAction详解
  • @Value 注解(可以将配置文件中的值注入到 Spring 管理的Bean的字段中)
  • 云岚到家 秒杀抢购
  • FastDDS服务发现之PDP的收发
  • 如何防止技术泄密?企业的机密管控必需掌握的十个小窍门,守护数据安全无死角!【科普篇】
  • 产品设计理念:10个案例分享
  • Java异步编程CompletableFuture(串行,并行,批量执行)
  • 无人机动力测试台如何快速外接第三方传感器
  • 使用自定义LLM:RAGAs评估