public class Max<Key extends Comparable <Key>>//Key类型是实现了comparable的类型
{
private Key[]pq;
private int N=0;
public Maxpq(int maxN)
{
pq=(Key[])new Comparable[maxN+1];
}
public boolean isEmpty(){
return N==0;
}
public int size()//得到容量
{
return N;
}
public void insert(Key v)//插入,有序性被破坏,需要对树重新进行序列化
{
pq[++N]=v;
swim(N);
}
public Key delMax()
{
int key=pq[1];//第一个pq【0】不存,第一个有元素的是pq【1】,最优先值
exch(1,N--);//将最后一个元素放在第一个元素
pq[N+1]=null;//置最后一个元素为空
sink(1);//下沉,向下遍历,看是否有子节点大于该节点。(重新序列化树)
}
public void sink(int i) {//下沉
while(2*i<=N){
int j=2*i;
if(j<N&&less(j,j+1))j++;
if(! less(i,j))break;
exch(i,j);
i=j;
}
}
public void swim(int i) {//上浮
while(i>1&&less(i/2,i))
{
exch(i/2,i);
i=i/2;
}
}
public boolean less(int i,int j)
{
return pq[i].compareTo(pq[j])<0;
}
public void exch(int i, int j) {
Key key=pq[i];
pq[i]=pq[j];
pq[j]=key;
}
}