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

海城网站设计沈阳企业宣传片制作公司

海城网站设计,沈阳企业宣传片制作公司,上海做网站推荐,wordpress顶部菜单栏添加搜索目录 优先级队列 堆的概念 堆的创建 堆的向下调整 堆的插入 完整代码 优先级队列 队列是一种先进先出的数据结构,有些时候操作的数据可能带有优先级,出队列时就需要优先级高的数据先出队列。 在这种情况下,数据结构应该提供两个最基本…

目录

优先级队列

堆的概念

堆的创建

堆的向下调整

堆的插入

完整代码


优先级队列

队列是一种先进先出的数据结构,有些时候操作的数据可能带有优先级,出队列时就需要优先级高的数据先出队列

在这种情况下,数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象。这种数 据结构就是优先级队列(Priority Queue)。

堆的概念

如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki = K2i+1 且 Ki >= K2i+2) i = 0,1,2…,则称为小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。

 

注意:

  • 已知孩子节点为i,则双亲节点为 (i-1)/2;
  • 已知双亲节点为i,左孩子:2*i+1;右孩子:2*i+2。

堆的创建

堆的向下调整

这里以大根堆为例来讲解堆的向下调整。

题目:对于集合{ 27,15,19,18,28,34,65,49,25,37 }中的数据,如果将其创建成大根堆呢?

 首先我们要定义基本变量,来供使用。因为是对于集合中的数据进行创建大根堆,所以我们可以使用数组来进行。

public class TestHeap {public int[] elem;public int usedSize;public TestHeap(){this.elem = new int[10];}
}

对于如何把数组中的数据放到实现堆的数组里,我们可以通过for循环来进行放置。

注意:这里是有两个数组。

    public void intelem(int[] array){for (int i = 0; i < array.length; i++) {this.elem[i] = array[i];usedSize++;}}

接着我们就要开始创建堆了

    public void createHeap(){for (int parent = (this.usedSize-1-1)/2; parent >= 0 ; parent--) {shifDown(parent, this.usedSize);//每棵树结束时候都给个10,如果接着调整的节点比10//大了,说明这棵树一定调整完了}}

主要的重心在于如何写出shifDown这个方法。

 思路:

  1. 由上面我们能知道 child = parent*2+1。为了确保child的数组不越界,我们要确定循环条件。
  2. 因为是创建大根堆,所以要找到左右子树的最大值同根节点进行比较、交换。
  3. 关于break,这里因为当 前一个节点已经结束了,下面的节点也是结束的状态。
 /**** @param parent 每棵子树调整的起始位置* @param usedSize 判断 每棵子树 什么时候  调整结束*/private void shifDown(int parent, int usedSize) {int child = 2*parent+1;while(child < usedSize){//找到左右子树的最大值if(child+1 < usedSize && elem[child] < elem[child+1]){child++;}if(elem[child] > elem[parent]){swap(elem,child,parent);parent = child;child = 2*parent+1;}else{break;}}}private void swap(int[] elem, int i ,int j){int tmp = elem[i];elem[i] = elem[j];elem[j] = tmp;}

通过Test测试类和调试,我们能看到大根堆创建成功了。

public class Test {public static void main(String[] args) {int[] array = {27,15,19,18,28,34,65,49,25,37};TestHeap testHeap = new TestHeap();//把array的值赋值给testHeaptestHeap.intelem(array);testHeap.createHeap();
}

创建的堆下图,大根堆。

 

堆的插入

堆的插入总共需要两个步骤:

  1.  先将元素放入到底层空间中(注意:空间不够时需要扩容)
  2. 将最后新插入的节点向上调整,直到满足堆的性质

 其实这和上面的创建大根堆有些类似,但这里用到的是向上调整。

    //插入public void push(int val){if(isFull()){elem = Arrays.copyOf(elem,2*elem.length);}elem[usedSize] = val;sitUp(usedSize);usedSize++;}public boolean isFull(){return elem.length == usedSize;}
}

这里的关键在于向上调整部分代码的编写。

    private void sitUp(int child) {int parent = (child-1)/2;while(parent >= 0){if (elem[parent] < elem[child]){swap(elem,child,parent);child = parent;parent = (child-1)/2;}else{break;}}}

向上调整我们可以先确定孩子节点,最后一棵树的节点位置可以通过 useSize来确定,进而能确定双亲节点。

完整代码

TestHeap类

import java.util.Arrays;public class TestHeap {public int[] elem;public int usedSize;public TestHeap(){this.elem = new int[10];}public void intelem(int[] array){for (int i = 0; i < array.length; i++) {this.elem[i] = array[i];usedSize++;}}public void createHeap(){for (int parent = (this.usedSize-1-1)/2; parent >= 0 ; parent--) {shifDown(parent, this.usedSize);//没棵树结束时候都给个10,如果接着调整的节点比10大了。说明这棵树一定调整完了}}//alt+p+enter 直接生成/**** @param parent 每棵子树调整的起始位置* @param usedSize 判断 每棵子树 什么时候  调整结束*/private void shifDown(int parent, int usedSize) {int child = 2*parent+1;while(child < usedSize){//找到左右子树的最大值if(child+1 < usedSize && elem[child] < elem[child+1]){child++;}if(elem[child] > elem[parent]){swap(elem,child,parent);parent = child;child = 2*parent+1;}else{break;}}}//插入public void push(int val){if(isFull()){elem = Arrays.copyOf(elem,2*elem.length);}elem[usedSize] = val;sitUp(usedSize);usedSize++;}private void swap(int[] elem, int i ,int j){int tmp = elem[i];elem[i] = elem[j];elem[j] = tmp;}private void sitUp(int child) {int parent = (child-1)/2;while(parent >= 0){if (elem[parent] < elem[child]){swap(elem,child,parent);child = parent;parent = (child-1)/2;}else{break;}}}public boolean isFull(){return elem.length == usedSize;}
}

Test类

public class Test {public static void main(String[] args) {int[] array = {27,15,19,18,28,34,65,49,25,37};TestHeap testHeap = new TestHeap();//把array的值赋值给testHeaptestHeap.intelem(array);testHeap.createHeap();/*for (int i = 0; i < array.length; i++) {testHeap.push(array[i]);}testHeap.push(80);*/}
}

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

相关文章:

  • 凡科做的网站百度能收录吗关键词权重查询
  • 中江移动网站建设成品免费ppt网站
  • 制作一个网站都需要学什么做外贸的网站有哪几个
  • 网站验收模版网站开发技术架构
  • 商城网站功能列表wordpress 用户表
  • 网站被黑wordpress 插件发文章
  • 太原网站建设方案优化完整网站设计
  • 网站建设内容策划鹿泉网站制作公司
  • 盐城有没有做网站吗html网站标题怎么做的
  • 网站建设教程学校免费自助建站系统大全
  • 网站建设相关制度网站建设公司业务提成多少
  • 网站免费正能量软件不良宣传策划方案模板
  • 女生做网站编辑好不好可以做ppt的网站有哪些方面
  • 麻涌镇网站仿做php网站开发主要做什么
  • 网站建设专业吗广告公司怎么做业务
  • h5网站作用营销型公司网站
  • 网站营销的定义企业名录2020企业黄页
  • 工商银行建设银行招商银行网站天津网站优化公司电话
  • 建设银行英文网站破解wordpress
  • 做旅游网站的数据怎么来外贸联系网站
  • 石家庄物流网站建设wordpress 外部链接插件
  • 贵州建设监督管理局网站设计logo的软件有哪些
  • 域名注册了如何做网站网站积分的作用
  • 域名 就一个网站六安杂谈
  • 给客户做非法网站山东省住房和城乡建设厅二建查询
  • 上海网站建设定制公司具有价值的建网站
  • 如何做网站导航栏wordpress摘要字数的插件
  • 常德政务网站赤峰建网站的电话
  • 企业年报查询网站北京外包公司有哪些
  • 织梦万网网站搬家教程wordpress 友链