Author:
nice01qc
Time :
Time :
优先队列算法
通过二叉堆实现优先队列…
使用长度为N+1的私有数组来存放数据,第一个不存放数据。
通过上浮使得第一个元素永远最大,且数据成二叉堆状。
private void swim(int k){
while(k > 1 && less(k/2,k)){
exch(k/2,k);
k = k/2;
}
}
把最后一个元素和第一个元素替换,然后把第一个元素下沉,可以实现删除第一个效果
private void sink(int k){
while(2k <= N){
int j = 2 * k;
if(j < N && less(j+1,j))j++; // 使收敛更快,关键是挑出左右节点最大的那个
if(less(j,k)) break; // 当子元素小于父元素时,可以终止了,没必要再继续了
exch(k,j);
k = j;
}
}
因此通过这两个函数可以轻松获取总元素数量,获取最大/最小,删除最大/最小。