双端堆c语言,数据结构——双端堆(C语言)

定义

双端堆:是一棵完全二叉树,该完全二叉树要么为空,要么同时满足下列性质:

(1) 根节点不包含元素;

(2) 左子树是一个最小堆;

(3) 右子树是一个最大堆;

(4) 如果右子树不空,令i是左子树中任意一节点,j是i在右子树中的对应节点。如果i在右子树中的对应节点不存在,则令j为i父节点在右子树中的对应节点。对于节点i和j,节点i的关键字小于等于j的关键字。

c90e3dc0ebcdef09929b0c7016ef0642.png

双端堆的插入操作

步骤

(1)若插入的新元素是在最小堆,将新插入节点与其在最大堆中对应节点相比较,如果大于对应节点,则将两个节点元素互换,对最大堆执行max_insert操作;否则,只需对最小堆执行min_insert操作。

(2)若插入的新元素是在最大堆,将新插入节点与其在最小堆中对应节点相比较,如果小于对应节点,则将两个节点元素互换,对最小堆执行min_insert操作;否则,只需对最大堆执行max_insert操作。

双端堆的删除操作

以下以删除最小元素为例,删除最大元素相似。

删除最小元素基本思想:

首先,将从最小堆的根节点删除的元素转换为从最小堆的叶子节点中删除元素的操作。这种转换是通过在沿根节点到叶子节点的路径上选择关键字值较小的节点逐步上移来完成的。其结果是把初始时位于最小堆根节点处的空位移到一个叶子节点p。然后,用初始时位于双端堆最后位置的元素temp插入到该叶子节点p。插入操作类似双端堆的插入操作,只是插入操作仅在最小堆中进行,且其中max_paretner(i)的返回值j有改变。

程序

函数声明:

#ifndef HEAP_H_INCLUDED

#define HEAP_H_INCLUDED

#include

#include

#include

#include

#define MAX_SIZE 10

int heap[MAX_SIZE];

void deap_insert(int *heap,int *n,int item);//双端堆插入操作

int delete_deap_min(int *heap,int *n);//删除双端堆的最小元素

bool max_heap(int n);//判断节点是否在最大堆中

int min_partner(int n);

int max_partner(int n);

void min_insert(int *heap,int n,int item);

void max_insert(int *heap,int n,int item);

void modified_deap_insert(int *heap,int i,int temp,int n);

int modified_max_partner(int i,int n);

#endif // HEAP_H_INCLUDED

函数定义:

#include"Heap.h"

/*双端堆的插入操作*/

void deap_insert(int *heap,int *n,int item)

{

int i;

(*n)++;

if((*n)==MAX_SIZE)//满堆

{

printf("The heap is full.\n");

exit(1);

}

if(2==(*n))//原来为空堆

heap[2]=item;

else

{

bool flag;

flag=max_heap(*n);//插入的节点是否在最大堆

switch(flag)

{

case true://节点在最大堆

i=min_partner(*n);//插入节点在最小堆所对应的节点

if(item

{

heap[*n]=heap[i];//交换元素

min_insert(heap,i,item);//把数据item插入到最小堆中

}

else

max_insert(heap,*n,item);//否则插入到最大堆中

break;

case false:

i=max_partner(*n);//插入节点在最大堆中对应的节点

if(item>heap[i])//比较最大堆节点和插入元素的大小

{

heap[*n]=heap[i];//交换元素

max_insert(heap,i,item);//插入到最大堆中

}

else

min_insert(heap,*n,item);//否则插入到最小堆

break;

}

}

}

/*删除双端堆的最小元素操作*/

int delete_deap_min(int *heap,int *n)

{

int i,j;

int temp;

int item;

if(*n<2)

{

fprintf(stderr,"The heap is empty.\n");

exit(1);

}

item=heap[2];//要删除的元素

temp=heap[(*n)--];//最后元素赋给temp;

for(i=2;2*i<=*n;)

{//将从最小堆根节点删除元素的操作

//转换为从最小堆的叶子节点中删除元素的操作

j=2*i;//j为i的叶子节点

if(j+1<=*n)

{

if(heap[j]>heap[j+1])

j++;//找出叶子节点中最小的关键字值节点

}

heap[i]=heap[j];//将叶子节点上移

i=j;//其结果是把初始时位于根节点处的空位移动到叶子节点i;

}

modified_deap_insert(heap,i,temp,*n);//用初始时位于双端堆最后位置的节点元素插入到叶节点i;

//该插入操作与deap_insert()的插入操作基本类似;只是插入操作仅在最小堆中;且其中max_partner(i)

//的返回值j改变;

return item;

}

/*判断节点n是否在最大堆中*/

bool max_heap(int n)

{

double a = log(n)/log(2);

double j = n + pow(2, (int)a-1);

double b = log(j)/log(2);

if((int)a == (int)b)

return false;

else

return true;

}

/*返回最大堆节点n对应最小堆的结点*/

int min_partner(int n)

{

double k = log(n)/log(2);

double a = pow(2, (int)k-1);

return n - (int)a;

}

/*返回最小堆节点n对应最大堆的结点*/

int max_partner(int n)

{

double k = log(n)/log(2);

double a = pow(2, (int)k-1);

return (n + (int)a)/2;

}

/*最小堆的插入操作*/

void min_insert(int *heap,int n,int item)

{

int i,parent;

i=n++;

parent=i/2;

while(parent>=1)

{

if(heap[parent]>item)

{

heap[i]=heap[parent];

i=parent;

parent/=2;

}

else break;

}

heap[i]=item;

}

/*最大堆的插入操作*/

void max_insert(int *heap,int n,int item)

{

int i,parent;

i=n++;

parent=i/2;

while(parent>1)

{

if(heap[parent]

{

heap[i]=heap[parent];

i=parent;

parent/=2;

}

else break;

}

heap[i]=item;

}

/*调整双端堆*/

void modified_deap_insert(int *heap,int i,int temp,int n)

{

int j;

int item=temp;

i++;

if(i==MAX_SIZE)//满堆

{

printf("The heap is full.\n");

exit(1);

}

if(2==i)//原来为空堆

heap[2]=item;

else

{

bool flag;

flag=max_heap(i);//插入的节点是否在最大堆

switch(flag)

{

case true://节点在最大堆

j=min_partner(i);//插入节点在最小堆所对应的节点

if(item

{

heap[i]=heap[j];//交换元素

min_insert(heap,j,item);//把数据item插入到最小堆中

}

else

max_insert(heap,i,item);//否则插入到最大堆中

break;

case false:

j=modified_max_partner(i,n);//插入节点在最大堆中对应的节点

if(item>heap[j])//比较最大堆节点和插入元素的大小

{

heap[i]=heap[j];//交换元素

max_insert(heap,j,item);//插入到最大堆中

}

else

min_insert(heap,i,item);//否则插入到最小堆

break;

}

}

}

int modified_max_partner(int i,int n)

{

double k = log(i)/log(2);

double a = pow(2, (int)k-1);

int j;

j=(i + (int)a);

if(j>n)

return j/2;

else return NULL;

}

程序测试:

#include"Heap.h"

int main()

{

int i,item;

int n=1;

for(i=2;i

{

scanf("%d",&item);

deap_insert(heap,&n,item);

}

for(i=2;i<=n;i++)

printf("%d ",heap[i]);

printf("\n");

item=delete_deap_min(heap,&n);

printf("The deleted data is:%d",item);

printf("\n");

for(i=2;i<=n;i++)

printf("%d ",heap[i]);

return 0;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/530241.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言和我的世界指令哪个难,我的世界难度有什么区别 难度选择指令介绍

我的世界中的难度(Difficulty)可以在Minecraft的选项菜单内切换。更改这个选项将直接影响到游戏本身。选项中并没有设定影响攻击性生物的可生成数量&#xff0c;包括和平模式。目前游戏共有和平、简单、普通和困难4种难度。我的世界难度区别和平&#xff1a;会生成攻击性生物&a…

w ndows10即将停止更新,微软开始警告Windows 10 v1909用户即将停止更新服务

如果您仍在运行Windows 10版本1909&#xff0c;版本1903或更早版本&#xff0c;则可能已经在系统任务栏中注意到一条新消息&#xff1a;Windows 10版本即将终止服务。根据Windows 10 May 2020 Update或2020年10月Update。为了将用户升级到最新版本的Windows 10&#xff0c;“您…

Android10不能用谷歌,谷歌真的很严格,一大波老APP将不能在安卓10.0运行

苹果iOS的一大优点就是软件生态&#xff0c;第三方APP都会主动适配新的iOS系统以及手机。虽然说Android的开放性是也是一大优点&#xff0c;但是第三方软件参差不齐的优化适配水平也让安卓的用户非常头疼。不过谷歌每年都在致力于让Android的软件生态更好。根据XDA的报道&#…

c语言编程季节输出春夏秋冬,c语言编程题: 用枚类型定义春、夏、秋、冬四个季节...

满意答案bcabcdefg2013.07.28采纳率&#xff1a;49% 等级&#xff1a;12已帮助&#xff1a;5373人#includeenum season{spring 1,summer,autumn,winter,};season GetSeasonByMonth(char month){if(month < 3 && month>1)return spring;else if(month < 6 …

华为升级harmonyos的机型名单,华为鸿蒙 OS 2.0 系统适配名单已出,四月推送,天玑机型暂时无缘...

原标题&#xff1a;华为鸿蒙 OS 2.0 系统适配名单已出&#xff0c;四月推送&#xff0c;天玑机型暂时无缘华为官方在 2020 年发布了旗下自研系统“HarmonyOS 2.0”版本&#xff0c;发布会现场展示了 HarmonyOS 2.0 开发者 Beta 版本&#xff0c;并开启开发者 Beta 的公测。此外…

android 混合开发 图片,混合开发的大趋势之一React Native之Image

文章是宝宝自己写的&#xff0c;你可以转走&#xff0c;标明哪来的就行王亟亟的大牛之路国庆这些天要么旅游要么WOW&#xff0c;感觉整个人都废了。。直接从黄种人晒成了非洲大酋长。。然而还是无橙&#xff0c;这礼拜要做7天&#xff0c;昨天把单元测试的东西整完后今天下午抽…

html5实现无缝滚动的效果,基于JavaScript实现无缝滚动效果

本文实例为大家分享了JavaScript实现无缝滚动效果展示的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下首先应该区分样式中的绝对定位和相对定位&#xff0c;一般来说&#xff0c;移动的单位为绝对定位&#xff0c;在这个实例中&#xff0c;移动的Ul就是绝对定位 &am…

html5内联框去滚动条,如何优雅的实现内联滚动条(前端底部固定方法 )

我是一个网易云粉&#xff0c;有没有发现网易云音乐两边的滚动条是互不相干的&#xff0c;而且头部和底部都是固定的&#xff0c;这是如何实现的呢&#xff1f;先看个图吧。网易云音乐的页面其实要实现这样一个内联滚动条不难。我们可以先从实现一个内联滚动条开始实现。实现方…

html中未填写完提示未填写,亚马逊官方试题(开店及运营篇)

六.玩转新账号单选1、可以在亚马逊网站投放广告吗&#xff1f;A:部分可以投放&#xff0c;部分则由亚马逊控制B:全部不可以C:全部都可以D:只可在网站页面有责投放 A2、恢复移动板块初始界面后台什么位置设置A:无法恢复B:需手动逐一恢复 C:右上角Setting里设置D:左下角设置 D3、…

科学计算机 分数计算公式,Z分数(标准分数,Z-Score)公式与在线计算器_三贝计算网_23bei.com...

输入原始数据(X)、平均数(M)、标准差(S)、Z分数值(Z)等4个变量中任意3个已知变量&#xff0c;点击计算按钮&#xff0c;可快速求出求出未知变量。Z 分数也叫标准分数(standard score)&#xff0c;能够真实的反应一个分数距离平均数的相对标准距离。如果我们把每一个分数都转换成…

说唱计算机网红,首档喊麦节目太奇葩,蹭了说唱热度,还请了被封杀网红当导师...

原标题&#xff1a;首档喊麦节目太奇葩&#xff0c;蹭了说唱热度&#xff0c;还请了被封杀网红当导师首档喊麦节目太奇葩&#xff0c;蹭了说唱热度&#xff0c;还请了被封杀网红当导师大家都知道&#xff0c;如今的综艺节目越来越多各种题材应有尽有&#xff0c;尤其是音乐类的…

计算机维修知识综述论文,机器学习领域各领域必读经典综述论文整理分享

原标题&#xff1a;机器学习领域各领域必读经典综述论文整理分享机器学习是一门多领域交叉学科&#xff0c;涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为&#xff0c;以获取新的知识或技能&#xff0c;重新组织…

计算机加一块硬盘,老电脑卡顿不一定没救了 加一块SSD就能焕发新生

【PConline 导购】我们经常遇到电脑卡顿的时候&#xff0c;有时不仅仅是网络的原因&#xff0c;其实&#xff0c;老电脑卡顿的根本原因在于&#xff0c;系统运行的程序超过硬件负荷而造成的。除了CPU显卡因素以外&#xff0c;硬盘读写性能慢也会导致电脑变卡顿。当感到电脑变慢…

维拉智能管家机器人_“女性机器人”广受欢迎,但却面临3大问题,男性坦言:不敢用...

服务型机器人是机器人当中技术难度最高的机器人&#xff0c;比起传统的工业机器人他们拥有高度的智慧&#xff0c;并且能够不断学习成长&#xff0c;我顾客提供最贴心的服务。服务型机器人中以类人型机器人最为受欢迎的&#xff0c;尤其是采用了硅胶制作的外貌的类人机器人&…

acdsee扫描没有图像_详解CT图像常见伪影成因及解决方法

CT 图像伪影 (artifact) 是指重建图像上与实际解剖结构不相符的密度异常变化。CT 图像比传统平扫X线更容易出现伪影&#xff0c;这是因为 CT 图像是由成千上万独立的原始测量数据重建而得&#xff0c;而计算机重建的一个假设性前提是这些原始数据是精确而稳定的&#xff0c;故任…

android 手机 熄屏 短信控制_华为手机音量键还隐藏着这8个实用功能,终于知道了...

阅读本文前&#xff0c;请您先点击上面的蓝色字体“生活妙招哩”&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到内容了。每天都有分享。完全是免费订阅&#xff0c;请放心关注。说到手机音量键&#xff0c;大家第一个想到的功能当然就是调节音量了&#xff0…

hadoop实训报告总结及体会_管理工程学院举办电子商务实训表彰大会

管理工程学院举办电子商务实训表彰大会 管理工程学院举办电子商务实训表彰大会 时间:2019-1-9 信息来源:管理工程学院2019年1月9日下午三点&#xff0c;管理工程学院在8号楼创业大讲堂隆重召开电子商务实训表彰大会&#xff0c;管理工程学院党委书记张立军&#xff0c;院…

印度孟买机器人餐厅_2020,送餐机器人的海外市场爆发之年

餐饮是民生基本&#xff0c;方便快捷是生活指数的本钱&#xff0c;送餐机器人作为提升餐饮行业运营效率的利器、智慧餐饮的重要代表&#xff0c;其发展显得尤为重要。据专家预测&#xff0c; 2020 将是送餐机器人的海外爆发之年。天时地利&#xff1a;智能之光&#xff0c;人力…

css文件插入背景音乐,h5页面添加背景音乐

个人工作笔记1.创建Audio元素的方法&#xff1a;(1)document.createElement() 方法(2)new Audio()2.音乐播放相关资料&#xff1a;https://developer.mozilla.org/en-US/docs/Web/API/HTMLAudioElement// 使用js生成Audio元素的方法var audio document.createElement(audio);/…

css 友情链接效果,友链样式与位置很重要!

友链交换&#xff0c;是我们SEOER的日常工作。那么&#xff0c;关于友链的样式和位置&#xff0c;你又了解多少呢&#xff1f;下面就和小编一起来看看吧&#xff01;一、友链意味着什么&#xff1f;友情链接&#xff0c;就是双方网站有一定相关性的前提下&#xff0c;互相在自己…