Heap类:
import java.util.Vector;
class heap {
int size;
Vector<Integer> v;
public heap() {
v = new Vector<>();
v.add(0);
size = 0;
}
public void insert(int a) {
v.add(a);
int i = ++size;
while (i > 1 && v.get(i / 2) < a) {
v.set(i, v.get(i / 2));
i /= 2;
}
v.set(i, a);
}
public int find(int a, int i) {//大根堆不需要区分相同值
if (i > size)
return 0;
if (a == v.get(i))
return i;
if (a < v.get(i))
return Math.max(find(a, 2 * i), find(a, 2 * i + 1));
return 0;
}
public int max() {
return v.get(1);
}
public void del(int i) {
int a=v.get(size);
v.remove(size--);
if (i == size + 1)
return;
while (i > 1 && v.get(i / 2) < a) {//上浮
v.set(i, v.get(i / 2));
i /= 2;
}
v.set(i, a);
int j = 2 * i;
while (j <= size) {//下沉
if (j < size && v.get(j) < v.get(j + 1))
j++;
if (a >= v.get(j))
break;
v.set(j / 2, v.get(j));
j *= 2;
}
v.set(j / 2, a);
}
}
函数入口:
import heap;
public class test {
public static void main(String[] args) {
heap h=new heap();
h.insert(5);
h.insert(9);
h.insert(7);
h.insert(30);
h.insert(30);
h.del(h.find(30,1));
h.del(h.find(7,1));
h.del(h.find(30,1));
h.del(h.find(9,1));
h.insert(3);
h.insert(7);
h.insert(6);
System.out.print(h.max());
}
}