用java实现一个基于堆排序的优先队列

来源:互联网 发布:js dom编程艺术 源码 编辑:程序博客网 时间:2024/04/28 00:54
com.sunny.heap
public class MaxPQ<Key>{
public static void main(String[] args){
MaxPQ<String> heap = new MaxPQ<String>(11);
heap.insert("S");
heap.insert("R");
heap.insert("T");
while(!heap.isEmpty())  
{  
System.out.println(heap.delMax());  
}
heap.show();
}

private key[] pq; // 基于堆的完全二叉树
private int N = 0; // 完全二叉树的大小

public MaxPQ(int max){
pq = (key[]) new Comparable[max+1];
}

public boolean isEmpty(){
return N == 0;
}

public void insert(key v){
pq[++N] = v;
swim(N);
}

public key delMax(){
key max = pq[1];
exch(1, N--);
pq[N+1] = null;
sink(1);
return max;
}
/**
* 比较数组qp中位于位置i和j的两个元素的大小
*/
private boolean less(int i, int j){
return pq[i].compareTo(pq[j]) < 0;
}

/**
* 交换数组pq中位置位于i和j的两个元素
*/
private void exch(int i, int j){
key temp = pq[i];
pq[i] = pq[j];
pq[j] = temp;

}

/**
* 由下至上的堆的有序化(上浮)
*/
private void swim(int k){
while (k > 1 && less(k/2, k)) {
exch(k/2, k);
k = k/2;
}
}

/**
* 由上至下的堆的有序化(下沉)
*/
private void sink(int k){
while (2*k <= N) {
int j = 2*k;
if (j < N && less(j, j+1)) {
j++;
}
if (less(j, k)) {
break;
}
exch(j, k);
k = j;
}
}

/**
* 打印数组a中的元素
*/
private  void show(){
for(int i=0;i<pq.length;i++){
System.out.print(pq[i]+",");
}
}
}