C语言HeapBottomUP算法,C语言堆的建立Percolate Up and Down
6-8 Percolate Up and Down (20 point(s))
Write the routines to do a “percolate up” and a “percolate down” in a binary min-heap.
Format of functions:void PercolateUp( int p, PriorityQueue H );
void PercolateDown( int p, PriorityQueue H );
where int p is the position of the element, and PriorityQueue is defined as the following:typedef struct HeapStruct *PriorityQueue;
struct HeapStruct {
ElementType *Elements;
int Capacity;
int Size;
};
Sample program of judge:#include
#include
typedef int ElementType;
#define MinData -1
typedef struct HeapStruct *PriorityQueue;
struct HeapStruct {
ElementType *Elements;
int Capacity;
int Size;
};
PriorityQueue Initialize( int MaxElements ); /* details omitted */
void PercolateUp( int p, PriorityQueue H );
void PercolateDown( int p, PriorityQueue H );
void Insert( ElementType X, PriorityQueue H )
{
int p = ++H->Size;
H->Elements[p] = X;
PercolateUp( p, H );
}
ElementType DeleteMin( PriorityQueue H )
{
ElementType MinElement;
MinElement = H->Elements[1];
H->Elements[1] = H->Elements[H->Size--];
PercolateDown( 1, H );
return MinElement;
}
int main()
{
int n, i, op, X;
PriorityQueue H;
scanf("%d", &n);
H = Initialize(n);
for ( i=0; i
scanf("%d", &op);
switch( op ) {
case 1:
scanf("%d", &X);
Insert(X, H);
break;
case 0:
printf("%d ", DeleteMin(H));
break;
}
}
printf("\nInside H:");
for ( i=1; i<=H->Size; i++ )
printf(" %d", H->Elements[i]);
return 0;
}
/* Your function will be put here */
Sample Input:9
1 10
1 5
1 2
0
1 9
1 1
1 4
0
0
Sample Output:2 1 4
Inside H: 5 10 9
这里最小端的插入是将树放在堆的最后一个位置,再进行向上调整操作,向上调整的过程是不断比较交换儿子与父亲的值。
删除最小值操作,是将最小值弹出,然后将最后一个元素放在最小值位置,再向下调整,向下调整的过程是不断比较父亲与儿子的值,这里左右儿子都要比较,如果发现小,就交换下去
完整代码#include
#include
typedef int ElementType;
#define MinData -1
#define MaxData 1000
typedef struct HeapStruct *PriorityQueue;
struct HeapStruct {
ElementType *Elements;
int Capacity;
int Size;
};
PriorityQueue Initialize(int MaxElements); /* details omitted */
void PercolateUp(int p, PriorityQueue H);
void PercolateDown(int p, PriorityQueue H);
void PercolateUp(int p, PriorityQueue H)
{
int i = p;
if (i == 1)
return; // 如果插入的是第一个根节点,那么不用 PercolateUp操作
while (i != 1)
{
// 如果儿子比父亲小就交换,最小堆
if (H->Elements[i] < H->Elements[i / 2])
{
int temp = H->Elements[i];
H->Elements[i] = H->Elements[i / 2];
H->Elements[i / 2] = temp;
}
else
break;
i = i / 2;
}
}
void PercolateDown(int p, PriorityQueue H)
{
int i = p;
int t; // t记录左右儿子更小值得下标
while (2 * i <= H->Size)
{
if (H->Elements[i] > H->Elements[2 * i])
{
t = 2 * i;
}
else
{
t = i;
}
if (2 * i + 1 <= H->Size) // 判断右子数是否存在
{
if (H->Elements[t] > H->Elements[2 * i + 1])
{
t = i * 2 + 1;
}
}
if (t == i)
break;
else
{
int temp = H->Elements[i];
H->Elements[i] = H->Elements[t];
H->Elements[t] = temp;
i = t;
}
}
}
void Insert(ElementType X, PriorityQueue H)
{
int p = ++H->Size;
H->Elements[p] = X; // 插入到最后
PercolateUp(p, H); // 向上调整堆
}
ElementType DeleteMin(PriorityQueue H)
{
ElementType MinElement;
MinElement = H->Elements[1]; // 取出最小的元素
H->Elements[1] = H->Elements[H->Size--]; // 用最后的元素替代最小元素
PercolateDown(1, H); // 向下调整堆
return MinElement;
}
int main()
{
int n, i, op, X;
PriorityQueue H;
scanf_s("%d", &n);
H = Initialize(n);
for (i = 0; i
{
scanf_s("%d", &op);
switch (op)
{
case 1:
scanf_s("%d", &X);
Insert(X, H);
break;
case 0:
printf("%d ", DeleteMin(H));
break;
}
}
printf("\nInside H:");
for (i = 1; i <= H->Size; i++)
printf(" %d", H->Elements[i]);
return 0;
}
/* Your function will be put here */
PriorityQueue Initialize(int MaxElements)
{
PriorityQueue H = (PriorityQueue)malloc(sizeof(struct HeapStruct));
H->Elements = (ElementType*)malloc((MaxElements + 1) * sizeof(ElementType));
H->Capacity = MaxElements;
H->Size = 0;
H->Elements[0] = MaxData;
return H;
}
C语言HeapBottomUP算法,C语言堆的建立Percolate Up and Down相关推荐
- 快速排序实验报告 c语言,快速排序算法c语言实验报告.docx
快速排序算法c语言实验报告 实验六:冒泡法排序 物理学416班赵增月F12XX日期:XX年10月31日 一·实验目的1.熟练掌握程序编写步骤: 2.学习使用冒泡法和选择法排序: 3.熟练掌握数组的定义 ...
- c语言考试算法,c语言考试常用算法docx.docx
c语言考试常用算法docx 求1~100的累加和#includevoid main(){inti=1,sum=0;while (i<=100){sum+=i;i++;}printf(" ...
- 10幻方c语言,幻方算法 C语言描述
幻方算法的所有情况描述及C语言表示 2019-03-30 讨论幻方前,先讨论一下动态申请数组大小 众所周知 在C语言中必须指定数组的大小 否则会报错.如果你不知道你要申请多大的数组怎么办?初始化一个非 ...
- 自动寻路算法C语言,bfs算法(c语言贪吃蛇自动寻路算法)
广度优先法(BFS)算法C/C++代码,要说明和图解!谢谢! #include #define MAX 10 int front=-1,rear=-1; struct node { int value ...
- 经典c语言程序设计算法,C语言程序设计和循环结构相关的经典算法之一.ppt
C语言程序设计和循环结构相关的经典算法之一 第七讲 循环结构的经典算法之一 程序设计举例 ;教 学目 的 :1.灵活运用循环语句 2.编写一些基本算法程序 教学重点和难点:重点:判断素数,求最大公约数 ...
- c语言程序设计 算法,C语言程序设计第二章算法
<C语言程序设计第二章算法>由会员分享,可在线阅读,更多相关<C语言程序设计第二章算法(38页珍藏版)>请在人人文库网上搜索. 1.C程序设计,主讲人:袁丽,燕大里仁基础教学部 ...
- c语言峰值算法_C语言寻找一组数据中的第一第二峰值
C语言寻找一组数据中的第一第二峰值 实验要求,我需要找出一组数组中的两个峰值:第一个峰值和第二个峰值及其数组下标.这组数据画出的图应该是这样的,我就要找出图中的那两个峰值 我写的程序如下,我试了一下, ...
- c语言排序算法_C语言写排序算法(二) —— 选择排序
上次联系的算法是冒泡排序,不知道小伙伴们还记得不,中间穿插了一下比特币相关的分享,嘿嘿.今天来分享一下选择排序. 算法描述:选择排序是从数组中选择最大(小)的元素放到数组的最后一个,然后往前移,接着从 ...
- c语言lzma算法,C语言编程使用lzma SDK对7z文件简略解压缩
有时候我们只需要单纯对lzma算法压缩的7z文件进行解压,有时需要在嵌入式设备上解压,使用p7zip虽然支持多种格式,但是不容易裁剪,使用lzma SDK是首选: 可以在这里找到各种版本:http:/ ...
最新文章
- html 显示消息数量,html实现消息按钮上的数量角标的实例详解
- 7个使用PyTorch的技巧,含在线代码示例!网友:我连第一个都不知道?!
- java 回滚异常_回滚事务并关闭抛出异常的连接
- LeetCode Text Justification(贪心)
- 企业轻资产化趋势难挡,易点租适时而起未来可期
- 华为手机30s桌面循环滑动_华为发飙了!麒麟820+双模5G,从2699元跌至2499元,超出消费者预期...
- Thread类的有关方法以及优先级
- 二叉排序树的删除操作
- JS new操作符执行之后背后的操作
- 【面试篇】Java多线程并发-Java中的CAS机制算法
- CIF进口货物流程图_FOB、CIF和CFR,你真的了解吗?
- 电脑主板跳线_电脑主板跳线连接图
- 10月24号、25号、26号三天PC端云音乐项目总结
- 【图像去噪】基于matlab GUI均值+中值+高通低通+巴特沃斯+PCA+小波+维纳滤波图像去噪【含Matlab源码 1705期】
- 戴尔笔记本重装系统按f几进入
- wps和office有什么区别?
- 深度学习中梯度消失和梯度爆炸的根本原因及其缓解方法
- mysql 设置连接超时_如何配置MySQL数据库超时设置
- linux设置环境变量将动态库加入环境变量步骤
- VMware WorkStation安装CentOS镜像