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

特色的南昌网站制作网站源码提取工具

特色的南昌网站制作,网站源码提取工具,网站建设价格与哪些,网站建设方案书doc模板题目描述 实现思路 要实现一个堆,我们首先要了解堆的概念。 堆是一种完全二叉树,分为大顶堆和小顶堆。 大顶堆:每个节点的值都大于或等于其子节点的值。 小顶堆:每个节点的值都小于或等于其子节点的值。 完全二叉树&#xff…

题目描述

实现思路

要实现一个堆,我们首先要了解堆的概念。

堆是一种完全二叉树,分为大顶堆和小顶堆。

  • 大顶堆:每个节点的值都大于或等于其子节点的值。

  • 小顶堆:每个节点的值都小于或等于其子节点的值。

完全二叉树:在一颗二叉树中,若除最后一层外的其余层都是满的,并且最后一层要么是满的,要么在右边缺少连续若干节点。

回到原题,实现一个大顶堆,使用数组作为底层数据结构,并提供以下操作:

  • 添加元素(add):向堆中添加一个元素。

  • 删除堆顶元素(poll):删除并返回堆顶元素(即最大值)。

 

首先我们需要明白一个事:

jdk提供的堆结构,也就是PriorityQueue优先级队列,删除堆顶元素(remove(),poll()),会进行下

沉操作,向最后插入元素(add(),offer()),会进行上浮操作,因为有这两个操作,所以在堆中,删除

堆顶元素,向最后插入元素不会改变堆结构。

但是向堆的中间进行插入或修改,就会改变堆结构,不会自己调整

所以我们实现堆,也得需要实现上浮和下沉操作

并且在上浮和下沉过程中,还需要交换元素,所以我们还需要实现一个数组中元素交换的函数

代码实现

	class MaxHeap{//存储堆中元素的数组int[] heap;//堆中元素的个数int size;//堆的初始容量,超出容量,add函数里2倍扩容int capacity;public MaxHeap(int capacity) {this.capacity = capacity;heap = new int[capacity];size = 0;}public void add(int value) {//判断是否需要扩容if(size == capacity) {capacity = capacity * 2;int[] newHeap = new int[capacity];System.arraycopy(heap,0,newHeap,0,size);heap = newHeap;}heap[size] = value;size++;heapifyUp();}//上浮操作,维持堆的性质public void heapifyUp() {//当前节点对应在数组中的索引int index = size - 1;//父节点的在数组中的索引 -- 只能有一个父节点int parentIndex = (index - 1) / 2;while(parentIndex >= 0 && heap[parentIndex] < heap[index]) {swap(heap,parentIndex,index);index = parentIndex;parentIndex = (index - 1) / 2;}}//删除并返回堆顶元素public int poll() {//判断堆中是否有元素if(size == 0) {return Integer.MIN_VALUE;}int maxValue = heap[0];heap[0] = heap[size - 1];size--;heapifyDown();return maxValue;}//下沉操作,维持堆的性质public void heapifyDown() {int index = 0;//一个节点有两个子节点int leftChildIndex = 2 * index + 1;int rightChildIndex = 2 * index + 2;while(leftChildIndex < size) {//找到左右子节点中比较大的那个int largerChildIndex = leftChildIndex;if(rightChildIndex < size && heap[rightChildIndex] > heap[leftChildIndex]) {largerChildIndex = rightChildIndex;}//如果当前节点大于等于最大的子节点,堆性质已经满足if(heap[index] >= heap[largerChildIndex]) {break;}swap(heap,index,largerChildIndex);index = largerChildIndex;leftChildIndex = 2 * index + 1;rightChildIndex = 2 * index + 2;}}public void swap(int[] nums,int i,int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}}

类似题目

【模板】堆_牛客题霸_牛客网
215. 数组中的第K个最大元素 - 力扣(LeetCode)

http://www.yayakq.cn/news/284122/

相关文章:

  • 房产中介网站建设模板网站和域名的区别
  • 西安制作手机网站wordpress中文版切换
  • 外贸建站系统源码手机网站制作公司 广州
  • 您的域名因未取得工信部网站备案号多语言站点 wordpress
  • 京东购物网站怎么做全站加速 wordpress
  • 网站代理登录网址谷歌chrome浏览器下载
  • 东莞招聘网官方网站嘉兴网站排名优化报
  • asp网站建设项目实训上海小红书seo
  • PHP网站开发工程师招聘wordpress 4.5.3 主题
  • 上海高端网站定制开发wordpress博客acg主题
  • 风雨同舟 网站建设购物网站代码html
  • 重庆知名网站移动网站开发语言
  • discuz网站编码wordpress tag到导航
  • 没网站域名可以做备案吗网站设计可以用性原则
  • wordpress多站点功能asp flash网站模板
  • php wordpress单本小说网站源码+采集网站设计大小
  • 潍坊网站建设建站做网站和易语言
  • 网站能否做二维码参考消息今天新闻
  • 眼镜网站源码清远网站关键词优化
  • 网站建设人员配置如何做好营销推广
  • 建外贸网站费用wordpress 附件密码保护
  • 手机网站如何建设网站服务器建设的三种方法是什么
  • 工程资料代做网站石家庄论坛建站模板
  • 东莞住房和城乡建设厅网站住房和城乡规划建设局官方网站
  • 智通人才网官网杭州seo哪家好
  • 为什么我网站打不开建设工程施工合同示范文本2017版
  • asp.net2.0网站开发全程解析 pdf网站页面数量
  • 帮别人做高仿产品网站 违法么做网站哪种编程语言最好
  • 网站建设技术经费预算网站制作价格公司
  • 小说网站排名做网站 聊城