优先队列(利用二叉堆实现)

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;
   }
}

你可能感兴趣的:(数据结构)