大根堆优先队列
来源:互联网 发布:淘宝美工用的什么软件 编辑:程序博客网 时间:2024/06/06 02:18
package com.algorithm.sort;import static java.lang.Integer.MIN_VALUE;/** * Created by yamorn on 15-3-23. *//* 使用堆实线的最大优先队列 */public class PriorityQueue { private int heapSize=-1; public void maxHeapify(int[] data, int i) { int l=left(i); int r=right(i); int max=i; if (l <= heapSize && data[l] > data[i]) { max=l; } if (r <= heapSize && data[r] > data[max]) { max=r; } if (max != i) { swap(data, max, i); maxHeapify(data, max); } } /* 返回最大关键字的元素 */ public int getMaximum(int[] data) { return data[0]; } /* 去掉并返回堆中具有最大关键字的元素 */ public int extractHeapMax(int[] data) { assert data.length>1; //取出具有最大关键字的节点,保存到临时变量max中 int max = data[0]; //将堆中具有最小关键字的元素放置到1的位置 data[0]=data[heapSize]; //将堆的大小减一 heapSize--; //重新堆化,满足大根堆的要求 maxHeapify(data, 0); return max; } /* 将i节点的关键字增大到key 做法: 将插入的元素不断的与其父节点比较(大根堆的性质),如果比父节点的关键字大,则交换 */ public void increaseKey(int[] data,int i,int key) { if (key < data[i]) { System.err.println("new key is smaller than current key."); } data[i]=key; while (i>=0 && data[parent(i)] < data[i]) { swap(data, i, parent(i)); i = parent(i); } } /* 将key按照优先级插入到堆中 做法: 首先增加一个关键字为negative infinity的叶子节点来扩展最大堆,调用 increaseKey 为新节点设置对应的关键字,同时保持最大堆的性质 */ public void maxHeapInsert(int[] data,int key){ heapSize++; data[heapSize]= MIN_VALUE; increaseKey(data, heapSize, key); } public int parent(int i){ return i/2; } public int left(int i){ return 2*i; } public int right(int i){ return 2*i+1; } public void swap(int[] data,int i,int j){ int temp = data[i]; data[i] = data[j]; data[j] = temp; } public static void main(String[] args) {// int[] data={15,13,9,5,12,8,7,4,0,6,2}; int data[] = new int[100]; PriorityQueue queue = new PriorityQueue(); queue.maxHeapInsert(data, 15); queue.maxHeapInsert(data, 13); queue.maxHeapInsert(data, 9); queue.maxHeapInsert(data, 5); System.out.println(queue.getMaximum(data));// queue.increaseKey(data, 1, 18);// System.out.println(queue.getMaximum(data)); System.out.println(queue.extractHeapMax(data)); System.out.println(queue.getMaximum(data)); }}
0 0
- 大根堆优先队列
- C++ 大根堆 实现优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- Sicily 1205. brainf*ck
- 接入微信分享 以及使用eclipse调试cocos2dx
- 基于JMS消息中间件的分布式系统初探究(一) - 通过JMS实现Web服务器与服务框架的通讯
- java 多线程学习笔记之 线程中断
- 我国互联网公司在美上市热潮消退
- 大根堆优先队列
- #ifndef #define #endif
- 常用打jar包方法
- 生成唯一32位ID编码代码Java(GUID)
- rfid系统组成及其功能
- ubuntu下使用配置好的VIM神器
- Android Fragment完全解析,关于碎片你所需知道的一切
- 深入理解Java内存模型(一)——基础
- RFID基础知识要点