[Java]堆

目录

一、堆的概念

二、大小根堆的建立

三、 堆的调整

1. 向下调整

2. 向上调整

三、堆的删除与插入


一、堆的概念

堆可以看做一个完全二叉树,如果有一个关键码的集合K = {k0k1 k2kn-1},把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中,并满足:Ki <= K2i+1 Ki<= K2i+2 (Ki >= K2i+1 Ki >= K2i+2) i = 012…,则称为小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。

二、大小根堆的建立

大根堆:

首先对一个无序的序列进行完全二叉树的建立,然后从下往上,从右往左找到第一个非叶子结点开始比较,与该节点的孩子结点进行比较,必须满足大于所有孩子结点。

小根堆的建立:

与大根堆类似,首先对一个无序的序列进行完全二叉树的建立,然后从下往上,从右往左找到第一个非叶子结点开始比较,与该节点的孩子结点进行比较,必须满足小于所有孩子结点。

三、 堆的调整

1. 向下调整

private void shiftDown(int parent,int len){
        int child = 2*parent + 1;
        while(child < len){
            if(child + 1 < len && elem[child] < elem[child + 1]){
                child++;
            }
            if(elem[child] > elem[parent]){
                int tmp = elem[child];
                elem[child] = elem[parent];
                elem[parent] = tmp;
                parent = child;
                child = 2 * parent + 1;
            }else{
                break;
            }
        }
    }

2. 向上调整

public void shiftUp(int child) {
        int parent = (child - 1) / 2;
        while (child > 0) {
            if (elem[parent] > elem[child]) {
                break;
            }
            else{
                int t = elem[parent];
                elem[parent] = elem[child];
                elem[child] = t;
                child = parent;
                parent = (child - 1) / 1;
            }
        }
    }

三、堆的删除与插入

堆删除根结点元素,最后一个结点进行补位,然后进行向下调整。

对于已经建好的堆进行插入和删除操作:

1. 插入到完全二叉树的最后位置上,然后向上调整,每次能影响的只是他所在的那个子树,以及另一边一直往下的子树,时间复杂度为O(log2n),就是树的高度。

2. 删除某结点后向下调整,时间复杂度也是完全二叉树的高度O(log2n).

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值