优先队列 堆实现 java
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相关推荐
- java 二叉堆_【数据结构】二叉堆:Java实现最大堆及堆排序
堆在逻辑上一棵完全二叉树,所以可以通过数组进行数据存储,而其余的树大多采用链式结构进行数据存储 堆分类: 大顶堆:大顶堆就是无论在任何一棵(子)树中,父节点都是最大的 小顶堆:小顶堆就是无论在任何一棵 ...
- [算法系列]优先队列,堆与堆排序
优先队列,堆与堆排序 1 优先队列 有时我们在处理有序元素时,并不一定要求他们全部有序. 很多情况下我们会收集一些元素, 处理当前最大的元素, 然后再收集更多元素, 再处理当前最大元素 - 这种情况下 ...
- c语言将数组的列项向左移动,【数据结构与算法分析——C语言描述】第六章:优先队列(堆)...
第六章:优先队列(堆) [TOC] 思考如下场景,老师布置了很多作业,现在你需要将作业打印出来,你将作业文件依照队列的形式放入待打印列表中,但此时,你希望最重要(或者是马上就要上交)的作业优先打印出来 ...
- java优先队列二叉_二叉堆与Java中的优先队列
之前在A*算法演示程序的编码过程中,发现javaScript并没有原生的优先队列,于是去Java中找到了PriorityQueue类,研究了一下源码.Java中的优先队列基于最小二叉堆实现.最小二叉堆 ...
- [剑指offer]面试题第[41]题[Leetcode][第235题][JAVA][数据流中的中位数][优先队列][堆]
[问题描述][困难] [解答思路] 1. 思路1 时间复杂度:O(logN) 空间复杂度:O(N) import java.util.PriorityQueue;public class Median ...
- [Leetcode][第347题][JAVA][前K个高频元素][优先队列][堆][遍历set/map]
[问题描述][中等] [解答思路] 1. 堆 复杂度 class Solution {public int[] topKFrequent(int[] nums, int k) {Map<Inte ...
- java堆算法,Java 基本功04-JVM-Java堆详解和GC算法
JVM GC 机制 1. 在此之前需要了解相关概念: 1.1 Java 堆内存: 在 HotSpot JVM 实现中 Heap 内存被"分代"管理. JVM 的内存首先被分割成两部 ...
- 【Java 虚拟机原理】堆区 | Java VisualVM 工具
文章目录 一.Java VisualVM 工具 二.堆区 一.Java VisualVM 工具 Java 中提供了一个监控当前设备 Java 程序的工具 Java VisualVM ; 在命令行中执行 ...
- 【数据结构与算法】左式堆的Java实现
引言 二叉堆是对优先队列的一种高效实现,左式堆是针对二叉堆合并操作困难的缺点,而提出的另外一种优先队列实现方式. 线性结构合并困难是显而易见的,而二叉堆那样高效的支持合并操作而且只使用一个数组更是难得 ...
最新文章
- 特征工程系列:特征筛选的原理与实现(下)
- 修改mysql参数_mysql动态修改参数
- linux内核的syslets补丁
- Android Service详解(二)第一个Service
- 笔记本怎么桌面显示计算机,笔记本电脑桌面不显示了如何解决
- 第一个Django应用程序_part1
- 前端:JSON.stringify() 的 5 个秘密特性
- java编程中的持有对方引用是什么意思?有什么作用?
- Maven中引入本地jar包
- 转:awakeFromNib/loadView/viewDidLoad总结
- selenium之滑块操作
- win10锁屏壁纸提取保存
- 如何解决:使用Xbrowser软件连接服务器显示灰屏
- html制作地球自转,利用CSS3实现地球自转
- HNU数据结构哈夫曼树建立
- 洛谷-P1598- 垂直直方图
- 我的2011--虚荣、挣扎、总结和转变的一年
- 写出HTML的基本结构 做简要说明,北京市顺义区2017年--2018年届高三二模语文试题(卷)与答案解析.doc...
- Lake Counting S
- 如何搞定会计人员头疼的固定资产盘点?
热门文章
- 基于 RT-Thread赛车控制算法开发
- 2021年春季学期-信号与系统-第十四次作业参考答案-第五小题参考答案
- 第16届智能车竞赛参赛队员提问-05-24
- 2021年春季学期-信号与系统-第十三次作业参考答案-第八小题
- UPC2710T高频放大器
- java awt canvas_JavaFX AWT Canvas
- 训练作用_我们口才训练微信群有哪些重要作用?
- 360p4虚拟服务器,360安全路由p4c常见的问题以及解决方法介绍
- python模块调用的用法_如何使用Python语言中的random模块调用方法
- os x 10.9.5怎么升级_鸿蒙手机系统终于定档!华为官宣发布时间,首批升级名单已出炉...