最大堆:
每个节点都大于等于它的两个子节点
堆的操作:
swim(k):上浮第k个元素sink(k):下沉第k个元素
优先队列
删除:delMax(最小堆delMin)插入:insert
代码框架
public class MaxPQ
<Key
extends Comparable<Key>> {
private Key
[] pq
;
private int N
= 0;
public MaxPQ(int cap
) {
pq
= (Key
[]) new Comparable[cap
+ 1];
}
public Key
max() {
return pq
[1];
}
public void insert(Key e
) {...}
public Key
delMax() {...}
private void swim(int k
) {...}
private void sink(int k
) {...}
private void exch(int i
, int j
) {
Key temp
= pq
[i
];
pq
[i
] = pq
[j
];
pq
[j
] = temp
;
}
private boolean less(int i
, int j
) {
return pq
[i
].compareTo(pq
[j
]) < 0;
}
}
实现swim
private void swim(int k
) {
while(k
> 1 && less(parent(k
), k
)) {
exch(parent(k
), k
);
k
= parent(k
);
}
}
实现sink
private void sink(int k
) {
while(left(k
) <= N
) {
int child
= left(k
);
if(right(k
) <= N
&& less(child
, right(k
)))
child
= right(k
);
if(less(child
, k
))
break;
exch(k
, child
);
k
= child
;
}
}
实现删除
private Key
delMax() {
int del
= pq
[1];
exch(1, N
);
pq
[N
] = null
;
N
--;
sink(1);
return del
;
}
实现插入
private void insert(Key e
) {
N
++;
pq
[N
] = e
;
swim(N
);
return;
}
转载请注明原文地址:https://blackberry.8miu.com/read-18767.html