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

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]+”,”);

}

}

}

点赞