当前位置: 首页 > wzjs >正文

华为公司网站建设方案模板微信支付 公司网站

华为公司网站建设方案模板,微信支付 公司网站,网站建设易网拓,公关策划公司网站源码目录 一、堆1.1 堆的概念与存储结构 二、堆的实现2.1 堆的结构定义2.2 堆的初始化与销毁2.3 堆的打印2.4堆的插入2.5 堆的删除2.6 取堆顶数据2.7求有效数据个数size 博主的博客个人主页~ 博主的数据结构专栏~ 上期博客我们介绍了树,本期我们来实现一种特殊的二叉树—…

目录

  • 一、堆
    • 1.1 堆的概念与存储结构
  • 二、堆的实现
    • 2.1 堆的结构定义
    • 2.2 堆的初始化与销毁
    • 2.3 堆的打印
    • 2.4堆的插入
    • 2.5 堆的删除
    • 2.6 取堆顶数据
    • 2.7求有效数据个数`size`

博主的博客个人主页~
博主的数据结构专栏~

在这里插入图片描述

上期博客我们介绍了树,本期我们来实现一种特殊的二叉树—上期博客,食用请点击~

一、堆

1.1 堆的概念与存储结构

堆是一种特殊的完全二叉树数据结构,堆分为大根堆(大顶堆)和小根堆(小顶堆),在大根堆中,每个节点的值都大于或等于其左右子节点的值;在小根堆中每个节点的值都小于或等于其左右节点的值。
在这里插入图片描述
在这里插入图片描述
完全二叉树适合用数组存储,它的节点排列非常规律,除最后一层外,每一层都是满的,且最后一层节点靠左对齐,用数组储存时,可根据根节点在数中的位置与数组下标的对应关系进行高效的访问和操作。因此我们将用数组来实现堆这一数据结构。

堆的性质:

  • 堆中某个结点的值总是不大于或不小于其父结点的值;
  • 堆总是⼀棵完全二叉树。
    完全二叉树的性质:
    对于具有 n 个结点的完全二叉树,如果按照从上到下从左到右的数组顺序对所有结点从0 开始编号,则对于序号为 i 的结点有:
  • i>0i 位置结点的双亲序号:(i-1)/2 ;若i=0i 为根结点编号,无双亲结点。
  • 2i+1<n,左孩子序号: 2i+1;若2i+1>=n 无左孩子。
  • 2i+2<n,右孩子序号: 2i+2;若2i+2>=n 无右孩子。

以上性质十分重要,只有知道以上性质我们才能操作实现堆。(以上性质读者可以通过上面给出的两幅图来验证,如有疑问,请在评论区留言。)

二、堆的实现

2.1 堆的结构定义

typedef int HPDataType;
typedef struct Heap
{HPDataType* arr;int size;    //有效数据个数int capacity;//容量大小
}HP;

由于使用数组实现堆,所以我们这边需要知道数组中存放了多少的有效数据size数组的容量大小capacity,它的结构和顺序表的结构相似。

2.2 堆的初始化与销毁

由于初始化和销毁和顺序表的方式相同,所以我们就直接给出代码了,关于顺序表读者可以点击这个观看:【数据结构】顺序表
初始化

void HPInit(HP* php)
{php->arr = NULL;php->capacity = php->size = 0;
}

销毁

void HPDestroy(HP* php)
{if (php->arr){free(php->arr);}php->arr = NULL;php->size = php->capacity = 0;
}

2.3 堆的打印

void HPPrint(HP* php)
{for (int i = 0;i < php->size;i++){printf("%d ", php->arr[i]);}printf("\n");
}

2.4堆的插入

在插入的实现过程中,第一个要考虑的问题就是数组的容量满了没有,如果满了,我们要增容,所以我们首先会判断容量够不够的问题,其次,堆这一数据结构,不像顺序表,它判断增不增容后,将数据往后一插就可以了,但堆它分为大根堆和小根堆,所以我们插入之后,如果不合适的话,还要调整数据的位置,来保证我们建的堆始终是大根堆或者小根堆那么应该如何调整呢?

我们以下面这幅图为例:
在这里插入图片描述
我们接下来要插入一个数字99,很明显它比里面的所有数字都要大,但它现在在堆的末尾,所以,我们要将它向上调整(即使我们建的是小根堆也一样,如果插入的数据比其他数据要小,我们依旧要向上调整)。我们知道通过孩子节点可以找到父节点,假设孩子节点为i,那么父节点为(i-1)/2
在这里插入图片描述
上图就是向上调整的过程图由于我们插入的是之前调整好的堆,所以我们只需要将新插入的和父节点比较即可。在代码实现过程中我会将交换向上调整操作单独封装成函数。

我们将以创建大根堆为示范:

void HPPush(HP* php, HPDataType x)
{assert(php);if (php->size == php->capacity){int newcapacity = php->capacity == 0 ? 4 : 2 * php->capacity;HPDataType* set =(HPDataType*)realloc(php>arr,2*newcapacity*sizeof(HPDataType));if (set == NULL){perror("realloc fail!");return 1;}php->arr = set;php->capacity = newcapacity;}php->arr[php->size] = x;AdjustUp(php->arr, php->size);php->size++;
}

向上调整

void AdjustUp(HPDataType* arr, int child)
{int parent = (child - 1) / 2;while (child > 0){if (arr[child] > arr[parent]){Swap(&arr[child], &arr[parent]);child = parent;parent = (child - 1) / 2;}elsebreak;}
}

交换:

void Swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}

测试代码:

#include "Heap.h"void test()
{HP hp;HPInit(&hp);HPPush(&hp, 10);HPPush(&hp, 20);HPPush(&hp, 30);HPPush(&hp, 40);HPPush(&hp, 50);HPPush(&hp, 70);HPPrint(&hp);
}int main()
{test();return 0;
}

测试结果:
在这里插入图片描述
还原成堆:
在这里插入图片描述
可以看出,依旧是大根堆

2.5 堆的删除

在堆结构中删除数据只能删除堆顶,我们不能直接将堆顶删除,不然的话就不是堆结构了,它成为了两个子树,所以我们在删除的时候,要先将最后一个元素和堆顶交换位置,之后有效数据个数size减一,即可删除堆顶元素,但此时操作依旧没有结束,因为经过我们的交换操作,我们建立的大根堆(小根堆)已经不是大根堆(小根堆)了,所以我们依旧要对其进行调整,只不过这次是向下调整,另外我们还要判断删除操作时堆结构是否为空。

我们以一下这幅图为例:
在这里插入图片描述
调整过程:
在这里插入图片描述
判空函数

//判空操作
bool HPEmpty(HP* php)
{assert(php);return php->size == 0;
}

向下调整算法

//向下调整
void AdjustDown(HPDataType* arr, int parent, int n)
{//假设左孩子大int child = parent * 2 + 1;while (child < n){if (child + 1 < n && arr[child] < arr[child + 1]){child++;}if (arr[child] > arr[parent]){Swap(&arr[child], &arr[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}

堆的删除

//堆的删除
void HPPop(HP* php)
{assert(!HPEmpty(php));Swap(&php->arr[0], &php->arr[php->size - 1]);php->size--;AdjustDown(php->arr, 0, php->size);
}

测试代码:

#include "Heap.h"void test()
{HP hp;HPInit(&hp);HPPush(&hp, 10);HPPush(&hp, 20);HPPush(&hp, 30);HPPush(&hp, 40);HPPush(&hp, 50);HPPush(&hp, 70);HPPrint(&hp);HPPop(&hp);HPPop(&hp);HPPop(&hp);HPPrint(&hp);
}int main()
{test();return 0;
}

测试结果:
在这里插入图片描述
还原成子树:
在这里插入图片描述

2.6 取堆顶数据

//取堆顶数据
HPDataType HPTop(HP* php)
{assert(!HPEmpty(php));return php->arr[0];
}

2.7求有效数据个数size

//求有效数据个数size
int HPSize(HP* php)
{assert(php);return php->size;
}

总结:
以上就是本期博客分享的全部内容啦!如果觉得文章还不错的话可以三连支持一下,你的支持就是我前进最大的动力!
技术的探索永无止境! 道阻且长,行则将至!后续我会给大家带来更多优质博客内容,欢迎关注我的CSDN账号,我们一同成长!
(~ ̄▽ ̄)~


文章转载自:

http://nSWE5FEv.fkqxf.cn
http://YxDPCVKW.fkqxf.cn
http://lLbI0Mmc.fkqxf.cn
http://tf7JuN3S.fkqxf.cn
http://NZcZlHwM.fkqxf.cn
http://FoqolyqX.fkqxf.cn
http://fEDyRNUl.fkqxf.cn
http://2LHz77JY.fkqxf.cn
http://niYbzTR2.fkqxf.cn
http://Wu8PSHji.fkqxf.cn
http://ANfkkVaj.fkqxf.cn
http://10GX6gcf.fkqxf.cn
http://mHzmCnrA.fkqxf.cn
http://G2UOvF1e.fkqxf.cn
http://aDP4d6KN.fkqxf.cn
http://T5DVujqh.fkqxf.cn
http://EfoibmHJ.fkqxf.cn
http://FUa2M9E1.fkqxf.cn
http://38cqtV0r.fkqxf.cn
http://Dd7rgT2F.fkqxf.cn
http://44wD1lnu.fkqxf.cn
http://NqElJfpj.fkqxf.cn
http://zCsiObEb.fkqxf.cn
http://Y0fR5dbZ.fkqxf.cn
http://AQcTszHv.fkqxf.cn
http://mQjSma2W.fkqxf.cn
http://l1w8HaQi.fkqxf.cn
http://1Z2FGStk.fkqxf.cn
http://hkVaGXZM.fkqxf.cn
http://M6JGqADS.fkqxf.cn
http://www.dtcms.com/wzjs/640029.html

相关文章:

  • 一个公司的网站怎么做的品牌建设部门的规章制度
  • 建设工程合同司法解释2021台州网站排名优化价格
  • 论坛类网站设计手机app软件开发需要多少钱
  • 网站建站如何入手北京seowyhseo
  • 网站开发的套路wordpress页面多打开空白
  • 哈尔滨做网站费用贵州省民贸民品企业信息管理系统
  • wordpress 侧边栏轮播搜索引擎优化课程
  • 腾讯云可以做网站吗云畅网站建设
  • 东莞知名网站建设安徽省交通运输厅
  • wordpress建站 东莞wap浏览器安卓版
  • 城乡建设部网站察周圣进证件玉树州公司网站建设
  • 怎样优化网站 优帮云技术合同 网站开发
  • 在网上做设计赚钱的网站wordpress微信公众平台开发教程
  • 网站怎么做一级域名跳转公司营业执照注册
  • 网站源码调试网络营销策划是什么意思
  • 微商软件商城总站免费建网站可信吗
  • 外包网站会自己做原型吗做图片网站会被
  • 番禺区网站建设龙岩市网站建设
  • wordpress重写插件优化设计五年级上册语文答案
  • 在线建设房屋设计网站.net美食网站开发源代码
  • 湖南企业网站营销设计免费域名网站的
  • 做家政公司网站孟州网站建设
  • 影视自助建站建筑设计前景怎么样
  • 高端网站建设品牌wordpress页面菜单
  • 怎么免费创建自己的网站平台和创互联的网站是多少
  • 网站图片等比缩小网页布局设计的一般步骤
  • 山东济宁省建设厅官方网站教育培训机构十大排名
  • 网站需要的栏目和内容廊坊网站建站网站
  • 网站建设策划书选题游戏加盟
  • 电子图书网站开发的目的钉钉小程序开发工具