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相关推荐

  1. 快速排序实验报告 c语言,快速排序算法c语言实验报告.docx

    快速排序算法c语言实验报告 实验六:冒泡法排序 物理学416班赵增月F12XX日期:XX年10月31日 一·实验目的1.熟练掌握程序编写步骤: 2.学习使用冒泡法和选择法排序: 3.熟练掌握数组的定义 ...

  2. c语言考试算法,c语言考试常用算法docx.docx

    c语言考试常用算法docx 求1~100的累加和#includevoid main(){inti=1,sum=0;while (i<=100){sum+=i;i++;}printf(" ...

  3. 10幻方c语言,幻方算法 C语言描述

    幻方算法的所有情况描述及C语言表示 2019-03-30 讨论幻方前,先讨论一下动态申请数组大小 众所周知 在C语言中必须指定数组的大小 否则会报错.如果你不知道你要申请多大的数组怎么办?初始化一个非 ...

  4. 自动寻路算法C语言,bfs算法(c语言贪吃蛇自动寻路算法)

    广度优先法(BFS)算法C/C++代码,要说明和图解!谢谢! #include #define MAX 10 int front=-1,rear=-1; struct node { int value ...

  5. 经典c语言程序设计算法,C语言程序设计和循环结构相关的经典算法之一.ppt

    C语言程序设计和循环结构相关的经典算法之一 第七讲 循环结构的经典算法之一 程序设计举例 ;教 学目 的 :1.灵活运用循环语句 2.编写一些基本算法程序 教学重点和难点:重点:判断素数,求最大公约数 ...

  6. c语言程序设计 算法,C语言程序设计第二章算法

    <C语言程序设计第二章算法>由会员分享,可在线阅读,更多相关<C语言程序设计第二章算法(38页珍藏版)>请在人人文库网上搜索. 1.C程序设计,主讲人:袁丽,燕大里仁基础教学部 ...

  7. c语言峰值算法_C语言寻找一组数据中的第一第二峰值

    C语言寻找一组数据中的第一第二峰值 实验要求,我需要找出一组数组中的两个峰值:第一个峰值和第二个峰值及其数组下标.这组数据画出的图应该是这样的,我就要找出图中的那两个峰值 我写的程序如下,我试了一下, ...

  8. c语言排序算法_C语言写排序算法(二) —— 选择排序

    上次联系的算法是冒泡排序,不知道小伙伴们还记得不,中间穿插了一下比特币相关的分享,嘿嘿.今天来分享一下选择排序. 算法描述:选择排序是从数组中选择最大(小)的元素放到数组的最后一个,然后往前移,接着从 ...

  9. c语言lzma算法,C语言编程使用lzma SDK对7z文件简略解压缩

    有时候我们只需要单纯对lzma算法压缩的7z文件进行解压,有时需要在嵌入式设备上解压,使用p7zip虽然支持多种格式,但是不容易裁剪,使用lzma SDK是首选: 可以在这里找到各种版本:http:/ ...

最新文章

  1. html 显示消息数量,html实现消息按钮上的数量角标的实例详解
  2. 7个使用PyTorch的技巧,含在线代码示例!网友:我连第一个都不知道?!
  3. java 回滚异常_回滚事务并关闭抛出异常的连接
  4. LeetCode Text Justification(贪心)
  5. 企业轻资产化趋势难挡,易点租适时而起未来可期
  6. 华为手机30s桌面循环滑动_华为发飙了!麒麟820+双模5G,从2699元跌至2499元,超出消费者预期...
  7. Thread类的有关方法以及优先级
  8. 二叉排序树的删除操作
  9. JS new操作符执行之后背后的操作
  10. 【面试篇】Java多线程并发-Java中的CAS机制算法
  11. CIF进口货物流程图_FOB、CIF和CFR,你真的了解吗?
  12. 电脑主板跳线_电脑主板跳线连接图
  13. 10月24号、25号、26号三天PC端云音乐项目总结
  14. 【图像去噪】基于matlab GUI均值+中值+高通低通+巴特沃斯+PCA+小波+维纳滤波图像去噪【含Matlab源码 1705期】
  15. 戴尔笔记本重装系统按f几进入
  16. wps和office有什么区别?
  17. 深度学习中梯度消失和梯度爆炸的根本原因及其缓解方法
  18. mysql 设置连接超时_如何配置MySQL数据库超时设置
  19. linux设置环境变量将动态库加入环境变量步骤
  20. VMware WorkStation安装CentOS镜像

热门文章

  1. h5物体拖动_研究了50+个爆款H5,原来他们刷屏的套路如此简单
  2. 各位亲朋好友新春大吉
  3. 负数补码(16进制转10进制的负数)
  4. 对抗网络之PG-GAN,无条件下生成更真实的人脸图像
  5. 【工具】- 在线画图
  6. 用vue简单写一个音乐播放器
  7. 为什么 128 KB 的魂斗罗可以塞下这么长的剧情?
  8. openofficeV2.0由SUN开发的一款免费不亚于微软的office软件
  9. 马斯克要买地当「城主」/ 苹果手表引入ChatGPT/ 小鹏辟谣多名核心高管离职…今日更多新鲜事在此...
  10. 学生个人网页制作成品