双端堆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;“您…

筛法求素数c 语言,位筛法求素数,有段代码看不懂,有大佬可以来说一下

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼就是BITArray[ (i -3)/ CHAR_BIT ]其中i从0开始&#xff0c;那下标不就为负了&#xff1f;而指向的又是哪个数据&#xff1f;下面是完整代码。#include #include #include #include #include #include#include int main( ){unsigne…

c语言中日期间的天数怎么计算,关于计算两个日期间天数的代码,大家来看看...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼这是原贴:http://post.baidu.com/f?kz100411727这是原码:#include "stdio.h"main(){long int i,a[2],b[2],c[2],x[12]{0,31,59,90,120,151,181,212,243,273,304,334},y,z[2];scanf("%ld-%ld-%ld %ld-%ld-%ld"…

linux nf conntrack,Linux基于mark的策略路由以及nf_conntrack RELATED

谈到什么是意义&#xff0c;话题总显得很大&#xff0c;近日每晚都和老城里的朋友聊老城的文化&#xff0c;老城的老房子&#xff0c;老城的叫卖声&#xff0c;老城的方言…进行了很多的思考&#xff0c;也挺充实。至于技术方面&#xff0c;也有跟朋友以及前同事聊过&#xff0…

android 根据资源名称,如何在Android中按名称访问可绘制资源

你可以做这样的事情。public static Drawable getDrawable(String name) {Context context YourApplication.getContext();int resourceId context.getResources().getIdentifier(name, "drawable", YourApplication.getContext().getPackageName());return contex…

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

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

android 回归测试,android测试:monkey使用方法

android测试&#xff1a;monkey使用方法Android Sdk给我们提供了Monkey和Monkeyrunner这两个自动化测试工具。一、什么是MonkeyMonkey是一个命令行工具&#xff0c;可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流&#xff0c;实现对正在开发的应用程序进行压…

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 …

android fragment addtobackstack,Android Fragment Back Stack的问题

我对android片段Backstack的工作方式遇到了一个很大的问题&#xff0c;对于提供的任何帮助将不胜感激。假设您有3个片段[1] [2] [3]我希望用户能够导航[1] > [2] > [3]但在返回的途中(按返回按钮)[3] > [1]。就像我想象的那样&#xff0c;这可以通过addToBackStack(..…

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

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

android如何实现QQ信息通知,android NotificationListenerService监听通知栏(qq 微信 短信)...

【实例简介】android NotificationListenerService 监听通知栏&#xff0c;android NotificationListenerService 监听通知栏 android NotificationListenerService 监听通知栏【实例截图】【核心代码】NLsevice└── NLsevice├── AndroidManifest.xml├── bin│ ├──…

rsync android app,如何rsync到android

问题描述如何连接到我的Android设备以rsync音乐(或其他东西)&#xff1f;最佳解决思路实际上在MTP /usb上使用rsync这比每个人都说的容易&#xff0c;首先注意到当GVFS安装MTP挂载时&#xff0c;它将在下面可用。您可以通过在图形file-browser(thunar /nautilus /etc)中打开手机…

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

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

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

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

w3c html5 客户端缓存数据格式,Html5应用程序缓存(Cache manifest)

一、作用离线浏览 - 根据文件规则把资源缓存在本地&#xff0c;脱机依然能够访问资源&#xff0c;联网会直接使用缓存在本地的文件。优化加载速度&#xff0c;节约服务器资源。二、适用场景正如 manifest 英译的名字&#xff1a;离线应用程序缓存&#xff0c;这项功能是设计给会…

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

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

微型计算机中 辅助存储器通常包括,第7章 微型计算机存储器习题参考答案

第七章习题及答案7.1 一个微机系统中通常有哪几级存储器&#xff1f;它们各起什么作用&#xff1f;性能上有什么特点&#xff1f;答&#xff1a;一个微机系统中通常有3级存储器结构&#xff1a;高速缓冲存储器、内存储器和辅助存储器。高速缓冲存储器简称快存&#xff0c;是一种…

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

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

idea html 错误提示,Idea 代码编辑错误不飘红提示

洛谷P2055 &lbrack;ZJOI2009&rsqb;假期的宿舍 &lbrack;二分图最大匹配&rsqb;题目描述 学校放假了 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如 A 和 B 都是学校的学生,A 要回家,而 C 来看B,C 与 A 不认识. ...noip模拟赛…