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

宁波做网站哪家好网站开发招标技术要求

宁波做网站哪家好,网站开发招标技术要求,海外域名,如何从客户网站开发客户一.前言 前面我们讲解了二叉树的概念以及二叉树的存储结构#xff1a;https://blog.csdn.net/yiqingaa/article/details/139224974?spm1001.2014.3001.5502 今天我们主要讲讲二叉树的存储结构#xff0c;以及堆的实现。 二.正文 1.二叉树的顺序结构及实现 1.1二叉树的顺序…一.前言 前面我们讲解了二叉树的概念以及二叉树的存储结构https://blog.csdn.net/yiqingaa/article/details/139224974?spm1001.2014.3001.5502 今天我们主要讲讲二叉树的存储结构以及堆的实现。 二.正文 1.二叉树的顺序结构及实现 1.1二叉树的顺序结构 普通的二叉树是不适合用数组来存储的因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事一个是数据结构一个是操作系统中管理内存的一块区域分段。 1.2堆的概念及结构 如果有一个关键码的集合K  { k₀k₁k₂ …k_(n-1)(注意_()在这里表示里是下标 如我们这里表示的是k的下标是n-1}把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中并满足K_(i) K_(2*i1) 且K_(i) K_(2*i2) (K_(i) K_(2*i1) 且 K_(i)K_(2*i2) ) i  012…则称为小堆(或大堆)。将根结点最大的堆叫做最大堆或大根堆根结点最小的堆叫做最小堆或小根堆。 堆的性质 堆中某个结点的值总是不大于或不小于其父结点的值。堆总是一棵完全二叉树。 值得注意的是这里我们虽然把它想像成树的形状但其实我们的底层是数组我们是通过改变数组来控制这棵“树”的。 打个比方来说蚂蚁上树这道菜这盘菜里面真的有蚂蚁吗其实没有只不过是人为想像成的而已。在这里的二叉树也是同样的道理。 2.堆的实现 2.1堆向下调整算法 现在我们给出一个数组逻辑上看做一颗完全二叉树。我们通过从根结点开始的向下调整算法可以把它调整成一个小堆。向下调整算法有一个前提左右子树必须是一个堆才能调整。 这里我们给了一个数组。 int array[]  {27,15,19,18,28,34,65,49,25,37}; //向下调整算法 void AdjustDown(HPDataType* php,int n ,int parent )//php是数组指针 {int child parent * 2 1;if (php[child] php[child 1])child parent * 2 2;while (child n){if (php[child] php[parent]){Swap((php[child]), (php[parent]));parent child;child parent * 2 1;}else{break;}} } 2.2向上调整算法 现在我们给出一个数组逻辑上看做一颗完全二叉树。我们通过从根结点开始的向上调整算法可以把它调整成一个小堆。 我们给出了一个数组 int array[]  {15,18,19,25,28,34,65,49,27,372}; void AdjustUp(HPDataType* php,int child)//向上调整算法 {int parent (child - 1) / 2;while (child 0){if (php[child] php[parent]){Swap((php[child]), (php[parent]));child parent;parent (child - 1) / 2;}else{break;}} } 2.3堆的插入 先插入一个10到数组的尾上再进行向上调整算法直到满足堆。 void HPPush(HP* ps,HPDataType x)//堆尾插入数据ps是我们堆指针 {assert(ps);if (ps-size ps-capacity){int newcapacity ps-capacity 0 ? 4: ps-capacity * 2;HPDataType* arr (HPDataType*)realloc(ps-a,sizeof(HPDataType) * newcapacity);if (arr NULL){perror(realloc false);return;}ps-a arr;ps-capacity newcapacity;}ps-a[ps-size] x;ps-size;AdjustUp(ps-a,ps-size-1); } 2.4堆的删除  删除堆是删除堆顶的数据将堆顶的数据根最后一个数据一换然后删除数组最后一个数据再进行向下调整算法。 void HPPop(HP* ps)//删除堆顶数据 {assert(ps);assert(ps-size 0);Swap((ps-a[0]), (ps-a[ps-size - 1]));ps-size--;AdjustDown(ps-a,ps-size,0); } 3.堆代码的实现 Heap.h #pragma once #includestdio.h #includeassert.h #includestdlib.h #includestdbool.h typedef int HPDataType; struct Heap {HPDataType* a;int size;int capacity; }; typedef struct Heap HP; void HPInit(HP* ps);//堆的初始化 void HPDestroy(HP* ps);//堆的删除void HPPush(HP* ps, HPDataType x);//堆尾插入数据 void HPPop(HP* ps);//删除堆顶数据HPDataType HPTop(HP* ps);//取出堆顶数据 bool HPEmpty(HP* ps);//判断堆是否为空void Swap(HPDataType* a, HPDataType* b);//交换两个数据 void AdjustUp(HPDataType* php, int child);//向上调整算法 void AdjustDown(HPDataType* php, int n, int parent);//向下调整算法 int HPSize(HP* ps);//返回堆的有效数据个数 void HPSort(HPDataType* php, int n);//堆排序Heap.c  #includeHeap.h void HPInit(HP* ps)//堆初始化实现 {assert(ps);ps-a NULL;ps-size ps-capacity 0;}void HPDestroy(HP* ps)//堆销毁实现 {assert(ps);free(ps-a);ps-a NULL;ps-size ps-capacity 0; }void Swap(HPDataType* a,HPDataType* b)//两个数据的交换 {HPDataType tmp *a;*a *b;*b tmp; }void AdjustUp(HPDataType* php,int child)//向上调整算法 {int parent (child - 1) / 2;while (child 0){if (php[child] php[parent]){Swap((php[child]), (php[parent]));child parent;parent (child - 1) / 2;}else{break;}} }void HPPush(HP* ps,HPDataType x)//堆尾插入数据 {assert(ps);if (ps-size ps-capacity){int newcapacity ps-capacity 0 ? 4: ps-capacity * 2;HPDataType* arr (HPDataType*)realloc(ps-a,sizeof(HPDataType) * newcapacity);if (arr NULL){perror(realloc false);return;}ps-a arr;ps-capacity newcapacity;}ps-a[ps-size] x;ps-size;AdjustUp(ps-a,ps-size-1); } void AdjustDown(HPDataType* php,int n ,int parent )//向下调整算法 {int child parent * 2 1;if (php[child] php[child 1])child parent * 2 2;while (child n){if (php[child] php[parent]){Swap((php[child]), (php[parent]));parent child;child parent * 2 1;}else{break;}} } void HPPop(HP* ps)//删除堆顶数据 {assert(ps);assert(ps-size 0);Swap((ps-a[0]), (ps-a[ps-size - 1]));ps-size--;AdjustDown(ps-a,ps-size,0); } bool HPEmpty(HP* ps)//判断堆是否为空 {assert(ps);if (ps-size 0){return true;}return false; } HPDataType HPTop(HP* ps)//取出堆顶数据 {assert(ps);assert(ps-size 0);return ps-a[0]; } HPDataType HPSize(HP* ps)//返回堆有效数据个数 {assert(ps);return ps-size; } void HPSort(HPDataType* php,int n)//堆排序 {//降序 建小堆//升序 建大堆//建堆的第一种方法/*for (int i 1; i n; i){AdjustUp(php, i);}*///建堆的第二种方法for (int i (n - 1 - 1) / 2; i n; i)//(n-1-1)/2是为了找最后一个数据的父亲{AdjustDown(php, n, i);}int end n - 1;while (end 0){Swap((php[0]), (php[end]));AdjustDown(php, end, 0);end--;} } test.c  #includeHeap.h void test01() {HP hp;HPInit(hp);HPPush(hp, 6);HPPush(hp, 2);HPPush(hp, 3);HPPush(hp, 4);HPPush(hp, 10);HPPush(hp, 9);HPPush(hp, 7);HPPop(hp);printf(%d\n, HPTop(hp));printf(%d\n, HPSize(hp)); // HPDestroy(hp); } void test02() {int arr[] { 1,2,6,4,5,8,9,7 };HPSort(arr,sizeof(arr)/sizeof(int)); } int main() {//test01();test02();return 0; } 值得注意的是test.c是本人为了测试各函数是否正常而写出来的。 三.结言 堆的分享就到这了。觉得对自己有帮助的同学可不可以给个三连。 好啦同学们我们下期再见拜拜喽。
http://www.w-s-a.com/news/434396/

相关文章:

  • 有专门下载地图做方案的网站吗网站建设平台计划书
  • 网站闭站保护10个著名摄影网站
  • 安徽省建设工程信息网官网首页网站关键词排名优化工具
  • 深圳网站建设 百业网站专题教程
  • 公司seo是指什么意思如何来做网站优化
  • 化妆品网站建设平台的分析湖南网站搜索排名优化电话
  • 织梦网站修改教程视频教程管理类网站开发价格
  • 如何让新网站快速收录企业建站的作用是什么
  • 在线制作简历的网站做的最好的微电影网站
  • h5制作的网站网络游戏投诉平台
  • 做外贸网站好还是内贸网站好珠海新盈科技有限公 网站建设
  • php和网站开发网络软营销
  • 大型做网站的公司有哪些wordpress注册链接无效
  • 推荐门户网站建设公司网站开发移动端
  • 公司网站的栏目设置成都十大监理公司排名
  • 安溪住房和城乡建设网站关岭县建设局网站
  • 网站域名注销备案徐州房产网
  • 筑聘网windows优化大师自动安装
  • 龙华高端网站设计门户网站建设方案公司
  • 网站开发作用网站建设哪家专业
  • 网站设计报告总结南宁商城网站推广公司
  • 淘宝做店招的网站免费网站建设自助建站
  • 重庆工信部网站绵阳公司网站建设
  • 购物网站开发流程制作企业网页
  • 定州哪里可以做网站建设项目环境影响登记表备案系统网站
  • 网站建设费属于广告费小猪网站怎么做的
  • 国内优秀设计网站站长哈尔滨微网站建设
  • 如何建设一个优秀的电商网站沐风seo
  • 从零开始学网站建设知乎安防网站下载
  • 打开网站弹出qq应用软件有哪些