2019独角兽企业重金招聘Python工程师标准>>>

package org.loda.structure;/*** * @ClassName: MaxQ* @Description: 优先队列* *               顺序:大-->小* *               为了方便演示,目前只能存储int类型的整数,不过想要扩展也非常容易,加入比较器即可* *               为了纯粹的展现优先队列的操作,暂时不考虑添加元素超过数组长度导致数组扩容的情况,目前假设数组长度是足够的* * @author minjun* @date 2015年5月13日 下午5:46:46* */
public class MaxQ {private int[] array;private int heapSize;public MaxQ() {this(10);}public MaxQ(int size) {array = new int[size];}/*** * @Title: offer* @Description: 添加* @param @param key 设定文件* @return void 返回类型* @throws*/public void offer(int key) {// 将堆空间+1heapSize++;if(heapSize>array.length)throw new RuntimeException("超过了队列长度");// 为要添加的位置先占个坑array[heapSize - 1] = Integer.MIN_VALUE;//更新占位符所在的位置的值insertKey(heapSize - 1, key);}private void insertKey(int i, int key) {if(key<=array[i])throw new RuntimeException("key必须要比i位置的值大");array[i]=key;//如果新添加进来的元素比父亲更大,那么互换位置while(i>0&&array[i]>array[parent(i)]){exchange(i, parent(i));i=parent(i);}}/*** * @Title: poll* @Description: 取出* @param @return 设定文件* @return int 返回类型* @throws*/public int poll() {if (heapSize == 0)throw new RuntimeException("没有元素了");// 获取最大值,保存,并等待返回int max = array[0];// 将最后一个移动到开头,并重置最后一位的值array[0] = array[heapSize - 1];array[heapSize - 1] = 0;// 将堆空间-1heapSize--;// 重新调整堆结构maxHeapify(0);return max;}/*** * @Title: size* @Description: 返回堆空间大小* @param @return 设定文件* @return int 返回类型* @throws*/public int size() {return heapSize;}/*** * @Title: isEmpty * @Description: 堆空间是否为空 * @param @return    设定文件 * @return boolean    返回类型 * @throws*/public boolean isEmpty(){return size()==0;}private void maxHeapify(int i) {// 获取堆中该元素的左孩子位置和右孩子位置int l = left(i);int r = right(i);// 初始化最大元素的就是i位置的元素int largest = i;// 如果堆的左右孩子存在,并且有比他更大的,那么找出最大的那个if (l <= heapSize - 1 && array[l] >= array[i]) {largest = l;}if (r <= heapSize - 1 && array[r] >= array[largest]) {largest = r;}if (largest != i) {// 如果i不是最大值,那么将i和最大值换位exchange(i, largest);// 换位后,新的i索引处此时不见得可以满足堆性质,需要不断递归做验证maxHeapify(largest);}}/***由于数组索引是从0开始计算,那么左右元素的位置应该处于i*2+1和i*2+2的位置*而父元素所在的位置应该是(i-1)/2*/private int right(int i) {return i * 2 + 2;}private int left(int i) {return i * 2 + 1;}public int parent(int i){return (i-1)/2;}private void exchange(int i, int j) {int temp = array[i];array[i] = array[j];array[j] = temp;}public static void main(String[] args) {MaxQ q=new MaxQ();for(int i=0;i<10;i++){q.offer(Math.round((float)Math.random()*100));}while(!q.isEmpty()){System.out.print(q.poll()+"\t");}}}

转载于:https://my.oschina.net/u/1378920/blog/414521

算法导论——优先队列(大到小)相关推荐

  1. 函数模板案例_利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试

    案例描述: 利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试 #include <iostream& ...

  2. arraylist从大到小排序_程序猿面试宝典:你该知道的数组排序算法

    通常情况下,我们对数组的操作远远不止遍历判断大小或者判断奇偶数这么简单.比如,当我们需要求一个数组中所有元素的平均值时,操作很简单,只需要去遍历这个数组,并将其内部所有元素中存储的内容进行求和,最后用 ...

  3. 找出第i个小元素(算法导论第三版9.2-4题)

    找出第i个小元素(算法导论第三版9.2-4题) 期望时间复杂度:Θ(n) 最坏情况的时间复杂度Θ(n^2) int randomized_select_based_loop(int *array,in ...

  4. 找出第二小元素(算法导论第三版9.1-1题)

    找出第二小元素(算法导论第三版9.1-1题) 时间复杂度Θ(n) 比较次数n+⌈lgn⌉−2次 思路:将元素每次分成2部分,第一部分和第二部分元素成对比较.最终获得最小的元素,记录那些和最小元素比较后 ...

  5. c++ sort 从大到小排序_C语言必学的12个排序算法:堆排序(第7篇)

    题外话堆排序比之前的简单选择.冒泡算法.快速排序算法复杂一些,因为用到了树形数据结构,但是本文使用了数组实现完全二叉树,因此也比较简单.C语言初学者,可以简单了解其思想,具体的知识掌握可以参照数据结构 ...

  6. 算法导论9.1-1找第二小的元素

    文章目录 算法导论9.1-1 1.证明:在最坏情况下,找到n个元素中第二小的元素需要 n+ceil(lgn)-2 次比较.(提示:可以同时找到最小元素) 1.证明 n-1 2.证明 ceil(lg) ...

  7. C语言:使用冒泡算法将数组中的数据从大到小进行排序

    /*使用冒泡算法将数组中的数据从大到小进行排序*/ #include<stdio.h> #define N 5 int main() {int a[N];int i,j,t;printf( ...

  8. 算法概念:大O表示法/小o表示法/Ω/Θ

    如果算法A需要的时间与f(n)成正比,则算法A称为f(n)阶,表示为O(f(n)).函数f(n)称为算法的增率函数(growth-rate function).该表示法使用大写字母O来表示(order ...

  9. Java实验——设计一个数组模型,用于存储体育项目成绩男生体育项目有足球、长跑和铅球,女生体育项目有跳舞、体操、游泳。设计排序算法,将变量a、b、c中的数值按大小顺利进行互换(从大到小排列)。

    设计一个数组模型,用于存储体育项目成绩:男生体育项目有足球.长跑和铅球,女生体育项目有跳舞.体操.游泳. import java.util.Scanner;public class DataArray ...

最新文章

  1. Elasticsearch内存分配设置详解
  2. Kubernetes存储之Secret
  3. yunyang1994 tensorflow_yolov3 对于检测中心点的边缘物体时评估IOU对召回率和精度的影响
  4. restTemplate的介绍和使用
  5. php函数相关函数,PHP数组相关函数汇总
  6. python anaconda安装不上_Anaconda3 2.4与python 3.5安装错误(程序条目未找到; Windows 10)...
  7. 二分法求正常水深c语言程序,水力學复习.doc
  8. 设计模式—单例模式(思维导图)
  9. PATB 1038. 统计同成绩学生(20)
  10. Windows官方系统镜像下载及相关介绍
  11. opencv图片显示到mfc控件中,按键打开
  12. 前端如何制作出透明背景视频
  13. 辐角原理判断点和多边形的关系
  14. Cloudera Manager安装之利用parcels方式安装3或4节点集群(包含最新稳定版本或指定版本的安装)(添加服务)(CentOS6.5)(五)...
  15. Log4j 日志配置及初始化
  16. python excel表格排序_Python实现EXCEL表格的排序功能
  17. Github 上火热的十个 Python 项目,从Debug工具到AI水军、量化交易系统。
  18. 计算机信息系统安全服务等级证.
  19. WZOI-297数的三次方根
  20. android studio JSON Viewer

热门文章

  1. Python之旅:列表
  2. 2016级算法期末模拟练习赛-A.wuli51和京导的毕业旅行
  3. git命令查看远程分支
  4. [BZOJ 2588]Count on a tree
  5. SVN+post-commit 搭建自动同步版本库
  6. 两行代码实现字符串倒置
  7. CentOS下python-mysqldb安装
  8. vc编程中出现 fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include stdafx.h”?...
  9. 没有连接上aspnetdb.mdf数据库
  10. WinCE驱动编写小结(转载)