赞
踩
1.驱动类
public class MainClass {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
priorityqueue_test pq=new priorityqueue_test();
pq.insert(4);
pq.insert(2);
pq.insert(3);
System.out.print(pq.deleteMin());
System.out.print(pq.deleteMin());
System.out.print(pq.deleteMin());
}
}
2.优先队列
/*预备知识:
1.优先队列至少需要两种操作操作,即:插入、删除最小者
2.优先队列的实现,常用的有三种方法,链表实现、二叉查找树实现、二叉堆实现(小根堆,
左右儿子节点均大于父亲节点)。 我们这里使用二叉堆来实现优先队列。
3.二叉堆的实质是一个完全二叉树,树的插入从左到右,它的高度不高过LogN。
我们可以通过数组来实现完全二叉树,进而实现二叉堆。
4.对于数组中的位置i元素,它的左儿子在2i,右儿子在2i+1。
*/
public class priorityqueue_test {
private static final int DEFAULT_CAPACITY=13;
private int currentSize=0;
private int[] array= new int[DEFAULT_CAPACITY];
public boolean isEmpty(){
return array.length==0;
}
public void makeEmpty(){
array=new int[DEFAULT_CAPACITY];
}
public void insert(int x){
if(currentSize==array.length-1){//检测数组是否已满
enlargerAyyay(array.length*2);//扩大
}
int hole=++currentSize;//只能从数组的第二个位置开始插入,不能从第一个
for(;hole>1&&array[hole/2]/x>0;hole=hole/2){//比较与父节点的大小,实现上滤
array[hole]=array[hole/2];
}
array[hole]=x;
System.out.print(array[hole]);
}
public int deleteMin() throws Exception{
if(isEmpty()){
throw new Exception();
}
int minItem=array[1];//因为我们采用的小根堆,必然根是最小的
array[1]=array[currentSize--];
percolateDown(1);//下滤,保证大的数据在下面,最小的数据作为第一个
return minItem;
}
private void percolateDown(int hole) {
int child;
int data=array[hole];
for(;hole*2<=currentSize;hole=child){
child=hole*2;
if(child!=currentSize&&array[child+1]/array[child]<0){
child++;
}
if(array[child]/array[hole]<0){
array[hole]=array[child];
array[child]=data;
}
else{
break;
}
}
}
private void enlargerAyyay(int n) {
int[] array2=new int[n];
for(int i=0;i<=currentSize;i++){
array2[i]=array[i];
}
array=array2;
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。