13.3.优先队列的实现
\(13.3\)优先队列的实现
(注:这里实现的是大根堆)
1.优先队列的初始化
1 | public class MaxPQ<Key extends Comparable<Key>> |
2.辅助方法的实现
\(a.\)less
、swap
方法
1 | private boolean less(int i, int j) { |
\(b.\)swim
方法
swim
方法用于将堆底部的元素向上洄游,以维护堆的性质:
1
2
3
4
5
6private void swim(int k) {
while (k > 1 && less(k / 2, k)) {
swap(k / 2, k);
k = k / 2;
}
}
\(c.\)sink
方法
sink
方法用于将堆顶部的元素下沉,以维护堆的性质:
1
2
3
4
5
6
7
8
9
10
11
12
13
14private void sink(int k) {
while (2 * k <= N) {
int j = 2 * k;
//assure that the parent is the biggest of its children
if (j < N && less(j, j + 1)) {
swap (j, j + 1);
}
if (!less(k, j)) {
break;
}
swap (k, j);
k = j;
}
}