优先队列和堆的一些知识

1.概念

优先队列:普通的队列具有先进先出的特性,元素追加在队尾,如果删除的话,从队头删除。而在优先队列中,队列中的数据被赋予了优先级。当访问元素时,优先级最高的会先被删除。所以说优先队列是最高级数据先出。
:堆是指一个可以被看成一棵树的数组对象,堆总是满足下面两个性质:(1)堆中的某个节点必然小于(堆顶最大)或者大于(堆顶最小)其父节点的值;(2)所谓的堆呢,总是一棵完全二叉树。
堆有序:当一棵二叉树的每个节点,都大于等于他的两个子节点时,它被称为堆有序。
一棵大小为N的完全二叉树的高度为log2N+1(以2为底的)

2.堆有序化的两种方式

(1)由下至上的堆有序化
如果一个堆有序,因为某个节点的变化,这个节点比它的父节点还要大的时候,那么我们就需要通过交换该节点和父节点的关系来修复堆的顺序。交换之后这个节点还有可能比它现在的父节点大,再次交换它和它当前父节点的位置,以此类推,一直到这个节点小于它的父节点为止。因此这个大根堆将被恢复有序。
部分代码如下:

private void swim(int k){
    while(k > 1 && K/2 < k){
        int temp = k/2;
        k/2 = k;
        k = temp;       
    }
}

(2)由上至下的堆有序化
这种情况出现在和上面一种情况正好相反的状况中:在堆有序的状态下,因为某个节点小于它的两个子节点其中之一的时候,而顺序被打破。那么我们通过交换他和两个字节点中的较大者来将其恢复。这个节点在大根堆中处于一下向下移动的状态,因此形象的称之为“下沉”
部分代码如下:

private void sink(){
    while(2 * k <= N){
        int j = 2*k;
        if(j < N && j < j + 1) j++;
        if(!k < j) break;
        k = j;
    }
}

对于多叉堆的这些情况,同二叉堆。

3.优先队列的对路归并问题

有一个博主将的很不错
http://www.cnblogs.com/songdechiu/p/6736114.html

4.堆排序

http://www.cnblogs.com/CherishFX/p/4643940.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值