Java中的优先级队列可以利用数组完成优先级队列的一些操作。
首先,我们要给出数组存放数据,再给一个size保存数组的长度。(这里数组的长度可以自己设置一个,因为要构建出数组,在插入的操作过程中也可以对原先的数组进行扩容)
int[] arr = new int[10];
int size;
在每个操作的实现过程中,需要一些其他的方法来辅助各种操作的实现,需要利用堆中的向上调整、向下调整,还用交换数组元素的方法。代码如下:以小堆为例
//交换
public void swap(int[] arr,int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
//向上调整
public void shiftUp(int[] arr,int sz,int child) {
int parent = (child - 1)/2;
while (child > 0) {
if (arr[child] < arr[parent]) {
swap(arr, child, parent);
child = parent;
parent = (child - 1) / 2;
} else {
break;
}
}
}
//向下调整
public void shiftDown(int[] arr,int sz,int parent) {
int child = 2 * parent + 1;
while (child < sz) {
if (child + 1 < sz && arr[child + 1] < arr[child]) {
child++;
}
if (arr[child] < arr[parent]) {
swap(arr,child,parent);
parent = child;
child = 2 * parent + 1;
} else {
break;
}
}
}
作为队列,是可以实现队列的操作的,下面是代码实现
入队
//入队
public void offer(int value) {
if (size == arr.length) {
arr = Arrays.copyOf(arr,arr.length*2);
}
arr[size++] = value; //尾插
shiftUp(arr,size,size-1); //向上调整
}
出队
public int poll() {
if (size > 0) {
int peek = arr[0];
swap(arr,0,size-1);
size--;
shiftDown(arr,size,0);
return peek;
}
return -1;
}
取队顶元素
public int peek() {
return arr[0];
}
判断是否为空
public boolean isEmpty() {
return size == 0;
}
优先级队列是堆的应用,也可以完成队列的操作。