优先级队列:
优先级队列以数组形式存储数据,以树形形式组织元素的。
在以树形形式组织的时候,默认为小根堆形式。
小根堆:每一个父节点都小于它的左右节点。
在树中:
- 已知子节点,求父节点的公式为:(n-1)/2
- 已知父节点:
①求左孩子:2n+1
②求右孩子:2n+2
思路:
自定义一个类,属性为存放元素的数组和存放元素的下标,
- 添加元素
添加元素时,往树的最后一个添加,然后在从下往上将整个树重新调整成小根堆。
向上调整:判断当前添加的值和父节点的大小,如果父节点大,交换值。然后继续以当前位置为孩子,判读当前位置和其父节点的大小,如果父节点大,交换,依次向上判断,直到判断到根节点。如果父节点小于当前孩子,则说明已经满足小根堆的要求,则直接结束。 - 删除元素
把最后一个元素放入根节点的位置,进行覆盖,然后将最后一个节点进行置空,有助于GC进行回收,最后从上向下重新调整成为小根堆。
向下调整:从根节点开始,判断根节点和左右孩子的最小值的大小,如果根节点小,则满足小根堆,否则,交换根节点和左后孩子的最小值,依次向下判断。
代码:
class PriorityQueue {
int[] array; //存放元素的数组
int size;//存放元素的下标
public PriorityQueue() {
this(10);
}
public PriorityQueue(int s) {
this.array = new int[s];
this.size = 0;
}
public boolean add(int val) {
//插入:往最后一个插入. 插入的和父节点比较,比父小,调整
if (size == 0) {
array[size++] = val;
} else {
array[size] = val;