(一)优先级队列定义
(二)方法实现
获得最大元素方法
去掉最大元素方法
修改优先级方法
添加节点
(三)实现
/** * 用堆实现一个优先级队列 * 主要是添加、修改、删除节点 * 节点具有唯一性 * @author HHF * 2014年11月28日 */ public class PriorityQueue { public static int HEAPSIZE; public static void main(String[] args) { int[] array = Common.random(0,100,10); HEAPSIZE = array.length; build(array);//建一个极大堆 System.out.println("原始数据:"); Common.print(array); //获得最大值 System.out.println("优先级最高的节点:"+maximum(array)); //获得并删除最大值 System.out.println("将要被删除的优先级最高的节点:"+extractMax(array)); System.out.println("删除后的数据:"); Common.print(array); //修改优先级 increaseKey(array, 5, 100); System.out.println("修改后的数据:"); Common.print(array); //添加节点 insert(array, 101); System.out.println("插入后的数据:"); Common.print(array); //删除节点 System.out.println("删除的数据:"+delete(array, 1)); System.out.println("删除后的数据:"); Common.print(array); } /** * 返回优先队列中优先级最高的节点 * @param array * @return */ public static int maximum(int[] array){ return array[0]; } /** * 去掉并返回优先级队列中优先级最高的节点 * @param array * @return */ public static int extractMax(int[] array){ if(HEAPSIZE < 1){ (new Exception("队列内无元素 ")).printStackTrace(); return 0; } //获得最优节点 int max = array[0]; //删除最优节点 array[0] = array[--HEAPSIZE]; //整理堆 heapify(array, 0); //返回最优节点值 return max; } /** * 往优先队列中插入节点 * 记得要去重 * @param array * @param x */ public static void insert(int[] array, int x){ array[HEAPSIZE++] = x-1;//加一个元素 increaseKey(array, HEAPSIZE-1, x); } /** * 将优先级为x的节点优先级修改为k * @param array * @param i被修改值下标 * @param k */ public static void increaseKey(int[] array, int i, int k){ if(HEAPSIZE <= i){ (new Exception("修改优先级节点下标有误 ")).printStackTrace(); return; } if(k <= array[i]){ (new Exception("新节点的优先级被改低了 ")).printStackTrace(); return; } //优先级被修改了 array[i] = k; //整理队列 int parent = (i-1)/2; //父节点下标 while(parent>-1 && array[parent]<array[i]){//到了必要交换子父节点的时候了 Common.swap(array, parent, i); i = parent; parent = (i-1)/2; } } /** * 将下标为i的节点删除 并返回其值 * @param array * @param i */ public static int delete(int[] array, int i){ if(HEAPSIZE <= i){ (new Exception("删除节点下标有误 ")).printStackTrace(); return 0; } //优先级被修改了 int result = array[i]; //整理队列 array[i] = -1; heapify(array, i); HEAPSIZE--; return result; } /** * 将array变成一个极大堆 * @param array 堆 */ public static void build(int[] array){ int size = array.length; for(int i=size/2-1; i>=0; i--){ heapify(array, i); } } /** * 前提是i的左右孩子子树均已经为正常极大堆 * 将i调整为正确位置 * @param array * @param i 下标 */ public static void heapify(int[] array, int i){ int left = 2*i+1;//左孩子下标 int right = left+1;//右孩子下标 int large = 0; //选出left right 和 i 三个下标对应的最大值 记其下标为large if(left<HEAPSIZE && array[left] > array[i]){ large = left; }else{ large = i; } if(right<HEAPSIZE && array[right] > array[large]){ large = right; } //准备发生交换 和 递推下一轮 if(large != i){ Common.swap(array, large, i); heapify(array, large);//此时的i所对应的值 已经 下移一层到了large } } }
(ps:附件内附上工具类Common.zip)
相关推荐
用c语言实现的,简单易懂,希望对大家有用。
dheap(插入元素)、pop_max_dheap(删除最大元素)、pop_min_dheap(删除最小元素),is_dheap(堆验证)五个泛型算法,在此基础上实现了一个能在对数时间内获取最大和最小元素的优先级队列,相当于原stl优先级队列...
一个用堆实现的最大优先级队列,支持模板,动态内存申请,一个小例子,VS2008编译通过,大家一起进步。
使用c++模板实现的堆排序、优先级队列,在vs2010下编译运行通过。压缩文件里为两个工程文件,如果有vs2010的话解压缩打开sln文件就可以了,没有的话,新建工程将文件复制过去就ok了。如果有问题可以留言。
优先级队列为大小堆的结构
优先级队列的实现,包括堆的实现,最大堆的生成
数据结构课设——小大根交替堆实现的双端优先级队列及应用
二叉堆详解实现优先级队列.md
优先队列 ES6的优先级队列 描述 ES6实现具有TypeScript支持的... 为了提高性能,Prioqueue优先级队列使用数组实现的二进制堆作为其骨干,从而为插入和删除提供O(log n)性能。 用法 Prioqueue公开了可链接的API,可
数据结构与算法Python语言描述DS优先级队列和堆排序PPT学习教案.pptx
一、二叉堆概览 二、优先级队列概览 四、实现 delMax 和 insert 五、最后总结
实现基于C++的使用最小化堆排序的整型优先级队列
使用C#中的二进制堆的自定义优先级队列实现。为个人/俱乐部项目编写。 (据我所知)它符合大多数.NET标准。不是线程安全的。 信息 这段代码是从Java项目转换为利用C#功能集并在结构上更合理的东西。虽然原始的Java...
NULL 博文链接:https://yunjiechao-163-com.iteye.com/blog/2405056
算法和数据结构项目:优先级队列 以排序向量,未排序向量和堆的形式实现优先级队列。 实现之间的比较,显示了Heap数据结构的优点。
堆可用于实现优先级队列。 FastPriorityQueue尝试在JavaScript中实现面向性能的优先级队列。 它可能比其他类似的库快几倍。 当性能很重要时,它是理想的选择。 许可证:Apache License 2.0用法var x = new ...
优先队列Pqueue是堆优先级队列数据结构的实现。 它可以是最大订购量还是最小订购量,是否已同步以及对于并行操作是安全的。 它以O(log N)时间执行插入和最大/最小移除。例子// Let's create a new max ordered ...
使用二进制堆实现的非常快JavaScript优先级队列,而二进制堆又使用两个底层的并行。 完全没有依赖关系; 简直就是香草JS。 它是优先级队列的最快公开可用JavaScript库实现。 这是将Heapify与其他流行库进行比较的...
一. 优先队列的定义 优先队列是0个或多个元素的集合,每个元素都有一个优先权或值,对优先队列执行的操作有1) 查找;2) 插入一个新元素;3) 删除。...采用堆正好能实现该时间复杂度。相关代码实现如下: