用java构建一个优先队列
来源:互联网 发布:2017欧文季后赛数据 编辑:程序博客网 时间:2024/06/05 15:46
package Com.Tree;public class BinaryHeap<AnyType extends Comparable<? super AnyType>> {//定义初始化大小private int currentSize;private final static int DEFAULT_CAPACITY=100;private AnyType[] array;public BinaryHeap(){this(DEFAULT_CAPACITY);}public BinaryHeap(int capacity){currentSize = 0; array = (AnyType[]) new Comparable[ capacity + 1 ];}//利用一个数组建堆。public BinaryHeap(AnyType []items){currentSize=items.length;array=(AnyType[]) new Comparable[(currentSize+2)*11/10];int i=1;for(AnyType item:items)array[i++]=item;buildHeap();}//具体建堆方法private void buildHeap(){for(int i=currentSize/2;i>0;i--)precolateDown(i);}//放大数组private void enlargeArray(int capacity){AnyType [] newArray=(AnyType[]) new Comparable[capacity];for(int i=0;i<array.length;i++){newArray[i]=array[i];}array=newArray;newArray=null;}//向堆中插入一个数public void insert(AnyType x){if(currentSize==array.length-1)enlargeArray(array.length*2+1);int hole= ++currentSize;for(array[0]=x;x.compareTo(array[hole/2])<0;hole/=2)array[hole]=array[hole/2];array[hole]=x;}//删除最小数public AnyType deleteMin(){if(isEmpty())throw new ArrayIndexOutOfBoundsException();AnyType minItem=findMin();array[1]=array[currentSize--];precolateDown(1);return minItem;}//下虑操作 将不满足堆序的数,一步步向下沉 直到满足堆序private void precolateDown(int hole){int child;AnyType tmp=array[hole];for(;hole*2<=currentSize;hole=child){child=hole*2;//纭繚鏈夊彸瀛╁瓙if(child!=currentSize&&array[child+1].compareTo(array[child])<0)child++;if(array[child].compareTo(tmp)<0)array[hole]=array[child];elsebreak;}array[hole]=tmp;}//找最小值public AnyType findMin(){ if( isEmpty( ) ) return null; return array[ 1 ];}public boolean isEmpty(){return currentSize==0;}public void makeEmpty(){currentSize=0;}}
下面为一个左氏堆 常常用来做合并
package Com.Tree;public class LeftistHeap {public static class LeftHeapNode{LeftHeapNode left;LeftHeapNode right;Comparable element;int npl;public LeftHeapNode(Comparable element){this(element,null,null);}public LeftHeapNode(Comparable element, LeftHeapNode left, LeftHeapNode right){this.element=element;this.left=left;this.right=right;npl=0;}}private LeftHeapNode root;public LeftistHeap(){root=null;}public boolean isEmpty(){return root==null;}public void makeEmpty(){root =null;}public Comparable findMin(){if(isEmpty())return null;return root.element;}//交换左右子树private void swapChild(LeftHeapNode t){LeftHeapNode tmp=t.right;t.right=t.left;t.left=tmp;}//插入操作public void insert(Comparable x){root=merge(new LeftHeapNode(x),root);}public LeftHeapNode merge(LeftHeapNode c1,LeftHeapNode c2){if(c1==null)return c2;if(c2==null)return c1;if(c1.element.compareTo(c2.element)<0)return merge1(c1,c2);elsereturn merge1(c2,c1);}private LeftHeapNode merge1(LeftHeapNode lh,LeftHeapNode rh){if(lh.left==null)lh.left=rh;else{lh.right =merge(lh.right,rh);if(lh.left.npl<lh.right.npl)swapChild(lh);lh.npl=lh.right.npl+1;}return lh;}//合并操作public void merge(LeftistHeap rhs){if(this==rhs)return ;root=merge(root,rhs.root);rhs.root=null; //杩涘叆鍨冨溇鍥炴敹}//删除最小值public Comparable deleteMin(){if(isEmpty())return null;Comparable minItem=root.element;root=merge(root.left,root.right);return minItem;}}
阅读全文
0 0
- 用java构建一个优先队列
- 用java实现一个基于堆排序的优先队列
- 基于Java优先队列API(PriorityQueue)构建哈夫曼树
- 使用优先队列构建赫夫曼树
- 实现一个优先队列
- JAVA队列之优先队列
- JAVA队列之优先队列
- 用java实现优先级别队列
- java优先队列
- java PriorityQueue优先队列
- java优先队列 PriorityQueue
- [java]优先队列
- 【Java】优先队列PriorityQueue
- Java优先队列
- JAVA优先队列
- 优先队列 java PriorityQueue
- Java数据结构----优先队列
- (java)优先队列
- uboot 移植学习过程遇到问题的解决方法
- matlab批量创建变量并赋值
- UML类图
- 四.python 对象类型之列表、元组
- 基于51和Protues仿真的82C55A 软件模拟读写时序
- 用java构建一个优先队列
- exists关键词和case表达式
- Linux下Redis安装笔记
- 【springmvc】传值的几种方式&&postman接口测试
- tensorflow 核心流程剖析 1-- 简介
- 数组中重复的个数
- 南京邮电CTF 后面的几个WEB题目 By Assassinh
- slf4j、jcl、jul、log4j1、log4j2、logback大总结
- Xamarin.Forms 用户界面——控件——Images