import java.util.Vector;
class heap {
private int size = 0;
private Vector<Integer> v;
public heap() {
v = new Vector<>();
v.add(Integer.MAX_VALUE);
}
public void insert(int a) {
v.add(a);
bob(++size, a);
}
public int find(int a, int i) {// 大根堆不需要区分相同值
return i > size ? 0 : (a == v.get(i) ? i : (a < v.get(i) ? find(a, 2 * i) | find(a, 2 * i + 1) : 0));
}
public int max() {
return v.get(1);
}
public void del(int i) {
int a = v.remove(size--);
if (v.get(i >> 1) < a)
bob(i, a);
else if (i != size + 1) {
i *= 2;
while (i <= size) {// 下沉
if (i < size && v.get(i) < v.get(i + 1))
i++;
if (a >= v.get(i))
break;
v.set(i >> 1, v.get(i));
i *= 2;
}
v.set(i >> 1, a);
}
}
private void bob(int i, int a) {
while (v.get(i >> 1) < a) {// 上浮
v.set(i, v.get(i >> 1));
i /= 2;
}
v.set(i, a);
}
}
Java大根堆(修订版)
于 2023-08-04 21:36:25 首次发布