package ch02Sort;
import java.util.Random;
import java.util.Stack;
//最大堆(优先队列)
public class MaxPQ<Key extends Comparable<Key>> {
private Key[] pq;
private int N = 0;
public MaxPQ(Key[] pq) {
this.pq = pq;
}
public boolean isEmpty() {
return N == 0;
}
public int size() {
return N;
}
public void insert(Key v){
pq[++N] = v;
swim(N);
}
public Key delMax() {
Key max = pq[1];
exch(1, N);
//jvm回收
pq[N--] = null;
sink(1);
return max;
}
//下沉
public void sink(int k){
while (2 * k <= N) {
int i = 2 * k;
if (i<N&&less(i, i + 1)) {
i++;
}
if(!less(k,i)) break;
exch(i,k);
k = i;
}
}
//上浮
public void swim(int k){
while (less(k/2,k)&&k>1){
exch(k/2,k);
k /= 2;
}
}
public boolean less(int i, int j) {
return pq[i].compareTo(pq[j])<0;
}
public void exch(int i, int j) {
Key t = pq[i];
pq[i] = pq[j];
pq[j] = t;
}
public Stack sort() {
Stack<Key> stack = new Stack<Key>();
while (!isEmpty()) {
Key max = delMax();
stack.push(max);
}
return stack;
}
public static void main(String[] args) {
int n = 50;
Integer[] a = new Integer[51];
for (int i = 0; i <= 50; i++) {
a[i] = new Integer(0);
}
MaxPQ<Integer> maxPQ = new MaxPQ<Integer>(a);
for (int i = 0; i < 50; i++) {
maxPQ.insert(new Random().nextInt()%50+50);
}
Stack<Integer> sort = maxPQ.sort();
while (!sort.isEmpty()) {
System.out.print(sort.pop()+" ");
}
System.out.println();
}
}
最大堆、优先队列、堆排序
最新推荐文章于 2022-07-07 18:28:15 发布