优先队列算法

通过二叉堆实现优先队列…

使用长度为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;
    }
}

因此通过这两个函数可以轻松获取总元素数量,获取最大/最小,删除最大/最小。