构建大顶堆

堆是具有以下性质的完全二叉树:

  • 每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;
  • 每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。

如下图:

对堆中的结点按层进行编号,将这种逻辑结构映射到数组:

当前节点的位置记为i,则其左节点的位置为2i+1,其右节点的位置为2i+2,父子节点的大小的关系:

  • 大顶堆 arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]
  • 小顶堆 arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]

构建大顶堆

给一个无序数组,构建一个大顶堆。

数组按层次生成的完全二叉树:

第一个非叶子节点为5,比较左右子节点和其值的大小,如果子节点比其节点值大,与子节点交换。左子节点6比5大,左子节点和其交换。

从下到上,从右到左遍历非叶子节点。下一个非叶子节点是15,与左右子节点比较值大小,18比15大,与左节点交换。

遍历到下一个非叶子节点是8,右节点比8大,与右节点交换。

遍历到下一个非叶子节点是12,右子节点比12大,与右子节点交换。

12与18交换以后,12节点比其左子节点15小,12节点与其左节点交换。

最终得到一个大顶堆。

构建大顶堆代码实现

从第一个非叶子节点位置为arr.length/2-1,从下到上,从右到左依次构建大顶堆。

js 复制代码
function buildLargeTopHeap(arr) {
    //构建大顶堆
    for (let i = arr.length/2 - 1; i >= 0; i--) {
        //从第一个非叶子节点从下至上,从右至左调整结构
        adjustHeap(arr,i, arr.length);
    }
    return arr;
}

function adjustHeap(arr, i, length) {
    let temp = arr[i];//先取出当前元素i
    for(let k=i*2+1;k<length;k=k*2+1){//从i结点的左子结点开始,也就是2i+1处开始
        if(k+1<length && arr[k]<arr[k+1]){//如果左子结点小于右子结点,k指向右子结点
            k++;
        }
        if(arr[k] >temp){//如果子节点大于父节点,将子节点值赋给父节点(不用进行交换)
            arr[i] = arr[k];
            i = k;
        }else{
            break;
        }
    }
    arr[i] = temp;//将temp值放到最终的位置
}
相关推荐
CodeLinghu2 分钟前
提示词链模式:一种利用LLM大语言模型处理复杂任务的强大范式
前端·人工智能·语言模型
逸风尊者4 分钟前
开发可掌握的知识:推荐系统
java·后端·算法
Learner__Q9 分钟前
每天五分钟:二分查找-LeetCode高频题解析_day4
python·算法·leetcode
J2虾虾11 分钟前
关于Ant Design Vue
前端·javascript·vue.js
智者知已应修善业11 分钟前
【字符串提取3个整数求和】2024-2-11
c语言·c++·经验分享·笔记·算法
唯唯qwe-16 分钟前
Day21:贪心算法 | 加油站,分发糖果
算法·贪心算法
程序员笨鸟18 分钟前
[特殊字符] React 高频 useEffect 导致页面崩溃的真实案例:从根因排查到彻底优化
前端·javascript·学习·react.js·面试·前端框架
Highcharts.js20 分钟前
从旧版到新版:Highcharts for React 迁移全攻略 + 开发者必知的 5 大坑
前端·react.js·前端框架·编辑器·highcharts
独角鲸网络安全实验室21 分钟前
高危预警!React核心组件曝CVSS 9.8漏洞,数百万开发者面临远程代码执行风险
运维·前端·react.js·网络安全·企业安全·漏洞·cve-2025-11953
西瓜凉了半个夏~21 分钟前
React专题:react,redux以及react-redux常见一些面试题
前端·javascript·react.js