优先级队列

private int[] array = new int[100];
private int size = 0;//[0,size)表示有效元素

//入队列
public void offer(int x) {
//1.把x放到数组末尾
array[size] = x;
size++;
//2.把x进行向上调整
//array表示用来承载堆的数组
//size表示数组的有效元素的个数
//size-1表示从哪个位置进行向上调整
shiftUp(array, size, size - 1);
}

private static void shiftUp(int[] array, int size, int index) {
int child = index;
int parent = (child - 1) / 2;
//循环中的条件 child > 0 是保证child不为根节点
while (child > 0) {
if (array[child] > array[parent]) {
int tmp = array[child];
array[child] = array[parent];
array[parent] = tmp;
} else {
break;
}
child = parent;
parent = (child - 1) / 2;
}
}

//出队列
public Integer poll() {
if (size == 0) {
return null;
}
int ret = array[0];
//1.将最后一个元素复制给0号元素
array[0] = array[size - 1];
//2.删除最后一个元素
size–;
//3.从0号下标开始进行向下调整
shiftDown(array, size, 0);
return ret;
}

public static void shiftDown(int[] array, int size, int index) {
//从父节点下标出发
//parent和child都是对应的下标
int parent = index;
//找左子树下标
int child = 2 * parent + 1;
//判断child下标是否超出size
while (child < size) {
if (child + 1 < size && array[child + 1] > array[child]) {
child = child + 1;
}
if (array[child] > array[parent]) {
int tmp = array[child];
array[child] = array[parent];
array[parent] = tmp;
} else {
break;
}
parent = child;
child = 2 * parent + 1;
}
}

//取队首元素
public Integer peek() {
if (size == 0) {
return null;
}
return array[0];
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值