news 2026/7/10 14:39:25

判断小根堆和大根堆

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
判断小根堆和大根堆

日常学习记录。

如有错误,还望指正!

一、判断小根堆

小根堆概念:小根堆的最小元素存放在堆顶,且任意一个非根节点的结点都大于或等于双亲结点。【孩子结点值>=双亲结点值】

结点下标介绍:

注:n为堆的结点总个数。

奇数结点双分支根结点下标[0,n/2-1]
双分支左孩子下标=2*根节点下标+1
双分支右孩子下标=2*根节点下标+2

偶数结点单分支根结点下标n/2-1
单分支左孩子下标n-1
双分支根结点下标[0,n/2-2]
双分支左孩子下标=2*根节点下标+1
双分支右孩子下标=2*根节点下标+2

算法思想:利用排除法,排除掉孩子结点值大于根节点的所有情况,如果都不符合以上情况,就是小根堆,否则不是。判断大根堆算法思想类似。

#include <stdio.h> //判断小根堆,堆以顺序表存储 bool judge(int a[],int n) //n为数组a的长度 { //偶数结点时:有单分支+双分支 if(n%2==0) { if(a[n/2-1]>a[n-1]) //判断单分支,若单分支的根节点>左孩子,则返回false return false; for(int i=n/2-2;i>=1;i--) //判断双分支,注意i的起始条件! { if((a[i]>a[2*i+1])||(a[i]>a[2*i+2]))//双亲节点和左右孩子结点大小比较 return false; } } //奇数结点时:无单分支,只有双分支 else { for(int i=n/2-1;i>=1;i--) //判断双分支,注意i的起始条件! { if((a[i]>a[2*i+1])||(a[i]>a[2*i+2])) return false; } } return true; } int main() { int a1[7]={8,15,10,21,34,16,12}; int a2[7]={8,15,10,21,34,16,7}; int a3[6]={8,15,10,21,34,16}; int a4[8]={8,15,10,21,34,16,12,30}; int a5[8]={8,15,10,21,34,16,12,10}; printf("%d\n",judge(a1,7));//1 printf("%d\n",judge(a2,7));//0 printf("%d\n",judge(a3,6));//1 printf("%d\n",judge(a4,8));//1 printf("%d\n",judge(a5,8));//0 return 0; } /* 0 8 / \ 1 15 10 2 / \ / \ 21 34 16 12 小根堆 3 4 5 6 8 / \ 15 10 / \ / \ 21 34 16 7 非小根堆 8 / \ 15 10 / \ / 21 34 16 小根堆 8 / \ 15 10 / \ / \ 21 34 16 12 小根堆 / 30 8 / \ 15 10 / \ / \ 21 34 16 12 非小根堆 / 10 */

二、判断大根堆

大根堆概念:大根堆的最大元素存放在堆顶,且任意一个非根节点的结点都小于或等于双亲结点。【孩子结点值<=双亲结点值】,和小根堆概念相反。

把判断小根堆的>全部改成<,其余不变

#include <stdio.h> //判断大根堆 bool judge(int a[],int n) //n为数组a的长度 { //偶数结点时:有单分支+双分支 if(n%2==0) { if(a[n/2-1]<a[n-1]) //判断单分支,若单分支的根节点<左孩子,则返回false return false; for(int i=n/2-2;i>=1;i--) //判断双分支,注意i的起始条件! { if((a[i]<a[2*i+1])||(a[i]<a[2*i+2]))//双亲节点和左右孩子结点大小比较 return false; } } //奇数结点时:无单分支,只有双分支 else { for(int i=n/2-1;i>=1;i--) //判断双分支,注意i的起始条件! { if((a[i]<a[2*i+1])||(a[i]<a[2*i+2])) return false; } } return true; } int main() { int a1[7]={25,13,10,12,9,16,7}; int a2[7]={25,13,10,12,9,8,7}; int a3[6]={25,13,10,12,9,8}; printf("%d\n",judge(a1,7)); printf("%d\n",judge(a2,7)); printf("%d\n",judge(a3,6)); return 0; } /* 25 / \ 13 10 / \ / \ 12 9 16 7 非大根堆 25 / \ 13 10 / \ / \ 12 9 8 7 大根堆 25 / \ 13 10 / \ / 12 9 8 大根堆 */

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/10 14:38:13

MA12070与PIC18F47K40构建高效音频系统设计

1. MA12070与PIC18F47K40音频系统设计概述 在当今音频设备小型化与高性能并重的趋势下&#xff0c;采用MA12070数字音频放大器与PIC18F47K40微控制器的组合方案&#xff0c;能够构建出兼具高音质与智能控制的紧凑型音频系统。MA12070作为英飞凌推出的高效D类音频放大器IC&#…

作者头像 李华
网站建设 2026/7/10 14:36:22

Qwen Code技能系统终极指南:三步打造你的智能开发助手

Qwen Code技能系统终极指南&#xff1a;三步打造你的智能开发助手 【免费下载链接】qwen-code An open-source AI coding agent that lives in your terminal. 项目地址: https://gitcode.com/GitHub_Trending/qw/qwen-code 你是否曾为重复的代码审查、繁琐的文件处理而…

作者头像 李华
网站建设 2026/7/10 14:35:33

Tabby分屏功能终极指南:如何高效管理多个终端会话

Tabby分屏功能终极指南&#xff1a;如何高效管理多个终端会话 【免费下载链接】tabby A terminal for a more modern age 项目地址: https://gitcode.com/GitHub_Trending/ta/tabby Tabby是一款面向现代开发者的终端模拟器&#xff0c;其强大的分屏功能让多任务处理变得…

作者头像 李华
网站建设 2026/7/10 14:35:08

League Akari:英雄联盟玩家的终极效率提升工具完全指南

League Akari&#xff1a;英雄联盟玩家的终极效率提升工具完全指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 在英雄联盟的激烈竞技环境中…

作者头像 李华