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

package keepthinker.sort;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.ListIterator;
import java.util.PriorityQueue;
import java.util.Random;public class MyPriorityQueue<T> {private static final int SIZE=10;Comparator<T> cp;ArrayList<T> list=new ArrayList<T>();public MyPriorityQueue(Comparator<T> cp){this.cp=cp;}/**取最大优先元素:获取根元素,并且使其与最堆底元素相交换,删除堆底元素,进行一次最大堆运算。*/public T extractMax(){if(list.size()==0) return null;T max= list.get(0);Collections.swap(list, 0, list.size()-1);list.remove(list.size()-1);Object[] ls=list.toArray();HeapList<T> hList=new HeapList(ls);maxHeapify(hList, 0);ListIterator<T> i = list.listIterator();for (int j=0; j<ls.length; j++) {i.next();i.set((T)ls[j]);}return max;}/**插入新元素:插入元素于最堆底,然后递归与父节点比较大小,满足条件就交换*/public void insert(T elem){list.add(elem);increaseKey(list.size()-1, elem);}/** 修改队列中元素:若修改的优先级小于原来则返回false,若大于则与父节点递归交换*/public boolean increaseKey(int i,T elem){if(cp.compare(elem, list.get(i))<0) return false;list.set(i, elem);int j;while(i!=0){j=((i-1)>>1);//>>1 意思为除以2(性能优化),获取父节点位置if(cp.compare(list.get(i),list.get(j))>0)Collections.swap(list, i, j);i=j;}return true;}private  void maxHeapify(HeapList<T> a,int i){int l=2*i+1;//left leafint r=2*i+2;//right leafint largest;if(l<a.heapSize&&cp.compare(a.arr[l],a.arr[i])>0){largest=l;}else{largest=i;}if(r<a.heapSize&&cp.compare(a.arr[r],a.arr[largest])>0){largest=r;}if(largest!=i){T temp=a.arr[i];a.arr[i]=a.arr[largest];a.arr[largest]=temp;maxHeapify(a,largest);}}private  static class HeapList<T>{public T[] arr;public int heapSize;public HeapList(T[] arr){this.arr= arr;this.heapSize=arr.length;}}public static void main(String[] args){MyPriorityQueue<Integer> que=new MyPriorityQueue<Integer>(new IntegerCondition());Random ra=new Random();for(int i=0;i<SIZE;i++)que.insert(ra.nextInt(1000));for(int i=0;i<SIZE;i++){System.out.println(que.extractMax());}}
}
/*** the absolute value of elem must not bigger than Integer.MAX_VALUE/2.* 11 12 5 28 92 9 8* @author KESHENGKAI** @param <Integer>*/
class IntegerCondition<Integer> implements Comparator<Integer>{@Overridepublic int compare(Integer arg0, Integer arg1) {// TODO Auto-generated method stubint a1=(java.lang.Integer) arg0;int a2=(java.lang.Integer) arg1;return  a1-a2;}}
class StringCondition<String> implements Comparator<String>{@Overridepublic int compare(String o1, String o2) {// TODO Auto-generated method stubreturn ((java.lang.String)o1).compareTo((java.lang.String)o2);}}

转载于:https://my.oschina.net/keepthinker/blog/212452

优先队列 堆实现 java相关推荐

  1. java 二叉堆_【数据结构】二叉堆:Java实现最大堆及堆排序

    堆在逻辑上一棵完全二叉树,所以可以通过数组进行数据存储,而其余的树大多采用链式结构进行数据存储 堆分类: 大顶堆:大顶堆就是无论在任何一棵(子)树中,父节点都是最大的 小顶堆:小顶堆就是无论在任何一棵 ...

  2. [算法系列]优先队列,堆与堆排序

    优先队列,堆与堆排序 1 优先队列 有时我们在处理有序元素时,并不一定要求他们全部有序. 很多情况下我们会收集一些元素, 处理当前最大的元素, 然后再收集更多元素, 再处理当前最大元素 - 这种情况下 ...

  3. c语言将数组的列项向左移动,【数据结构与算法分析——C语言描述】第六章:优先队列(堆)...

    第六章:优先队列(堆) [TOC] 思考如下场景,老师布置了很多作业,现在你需要将作业打印出来,你将作业文件依照队列的形式放入待打印列表中,但此时,你希望最重要(或者是马上就要上交)的作业优先打印出来 ...

  4. java优先队列二叉_二叉堆与Java中的优先队列

    之前在A*算法演示程序的编码过程中,发现javaScript并没有原生的优先队列,于是去Java中找到了PriorityQueue类,研究了一下源码.Java中的优先队列基于最小二叉堆实现.最小二叉堆 ...

  5. [剑指offer]面试题第[41]题[Leetcode][第235题][JAVA][数据流中的中位数][优先队列][堆]

    [问题描述][困难] [解答思路] 1. 思路1 时间复杂度:O(logN) 空间复杂度:O(N) import java.util.PriorityQueue;public class Median ...

  6. [Leetcode][第347题][JAVA][前K个高频元素][优先队列][堆][遍历set/map]

    [问题描述][中等] [解答思路] 1. 堆 复杂度 class Solution {public int[] topKFrequent(int[] nums, int k) {Map<Inte ...

  7. java堆算法,Java 基本功04-JVM-Java堆详解和GC算法

    JVM GC 机制 1. 在此之前需要了解相关概念: 1.1 Java 堆内存: 在 HotSpot JVM 实现中 Heap 内存被"分代"管理. JVM 的内存首先被分割成两部 ...

  8. 【Java 虚拟机原理】堆区 | Java VisualVM 工具

    文章目录 一.Java VisualVM 工具 二.堆区 一.Java VisualVM 工具 Java 中提供了一个监控当前设备 Java 程序的工具 Java VisualVM ; 在命令行中执行 ...

  9. 【数据结构与算法】左式堆的Java实现

    引言 二叉堆是对优先队列的一种高效实现,左式堆是针对二叉堆合并操作困难的缺点,而提出的另外一种优先队列实现方式. 线性结构合并困难是显而易见的,而二叉堆那样高效的支持合并操作而且只使用一个数组更是难得 ...

最新文章

  1. 特征工程系列:特征筛选的原理与实现(下)
  2. 修改mysql参数_mysql动态修改参数
  3. linux内核的syslets补丁
  4. Android Service详解(二)第一个Service
  5. 笔记本怎么桌面显示计算机,笔记本电脑桌面不显示了如何解决
  6. 第一个Django应用程序_part1
  7. 前端:JSON.stringify() 的 5 个秘密特性
  8. java编程中的持有对方引用是什么意思?有什么作用?
  9. Maven中引入本地jar包
  10. 转:awakeFromNib/loadView/viewDidLoad总结
  11. selenium之滑块操作
  12. win10锁屏壁纸提取保存
  13. 如何解决:使用Xbrowser软件连接服务器显示灰屏
  14. html制作地球自转,利用CSS3实现地球自转
  15. HNU数据结构哈夫曼树建立
  16. 洛谷-P1598- 垂直直方图
  17. 我的2011--虚荣、挣扎、总结和转变的一年
  18. 写出HTML的基本结构 做简要说明,北京市顺义区2017年--2018年届高三二模语文试题(卷)与答案解析.doc...
  19. Lake Counting S
  20. 如何搞定会计人员头疼的固定资产盘点?

热门文章

  1. 基于 RT-Thread赛车控制算法开发
  2. 2021年春季学期-信号与系统-第十四次作业参考答案-第五小题参考答案
  3. 第16届智能车竞赛参赛队员提问-05-24
  4. 2021年春季学期-信号与系统-第十三次作业参考答案-第八小题
  5. UPC2710T高频放大器
  6. java awt canvas_JavaFX AWT Canvas
  7. 训练作用_我们口才训练微信群有哪些重要作用?
  8. 360p4虚拟服务器,360安全路由p4c常见的问题以及解决方法介绍
  9. python模块调用的用法_如何使用Python语言中的random模块调用方法
  10. os x 10.9.5怎么升级_鸿蒙手机系统终于定档!华为官宣发布时间,首批升级名单已出炉...