堆和堆排序

大家好,我是周一。

今天我们聊聊堆,以及堆排序。

一、堆

谈到堆,首先我们要从二叉树说起,从二叉树到完全二叉树,再才到堆。

1、二叉树:

每个结点最多只能有两棵子树,且有左右之分

图片

2、完全二叉树:

一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中(除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树)编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。

图片

通俗的说法就是:叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部。需要注意的是,满二叉树肯定是完全二叉树,而完全二叉树不一定是满二叉树。

对于某个位置为i的节点,左孩子(如果有)2i+1,右孩子(如果有)2i+2,父节点(i-1)/2(向下取整)

3、堆:

首先是一个完全二叉树。同时区分大根堆和小根堆。

大根堆:每一颗子树的最大值都是头节点。

小根堆:每一颗子树的最小值都是头节点。

图片

(1)对于用户依次输入数字的一个数组,如何将其构造为大根堆?

每插入一个数都和父节点比较,大于父节点则和父节点交换,直到根节点;如果小于父节点,则马上停止比较。

// 对于新加进来的i位置的数,请放到数组合适位置,使其成为一个大根堆
private void heapInsert(int[] arr, int i) {
   
    // i = 0 或 i位置数小于父节点
    // while包含这两种终止条件
    while(arr[i] > arr[(i - 1)/2]) {
   
        <
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值