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

翻译网站平台建设朋友圈广告投放

翻译网站平台建设,朋友圈广告投放,做网站视频博彩,网站手机客户端生成我们一起见证堆是怎么形成的吧! 目录 堆的概念: 堆的结构: 堆的实现: 向下调整法: 向上调整法: 堆的初始化: 堆的插入: 堆的删除: 堆的判空和有效个数&#xf…

我们一起见证堆是怎么形成的吧!

目录

堆的概念:

堆的结构:

堆的实现:

向下调整法:

向上调整法:

堆的初始化:

堆的插入:

堆的删除:

堆的判空和有效个数:

堆的销毁:

堆的打印:

结语:


堆的概念:

堆总是一棵完全二叉树,如果有一个关键码的集合K={k0,k1,k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足ki\u003C=k2i+1且ki\u003C=k2i+2(或满足ki>=k2i+1且ki>=k2i+2),其中i=0,1,2,…,则称该集合为堆;堆又分为大堆和小堆

大堆:将根节点最大的堆叫做最大堆或大根堆

小堆:将根节点最小的堆叫做最小堆或小根堆

堆的结构:

堆有两种结构,分别为存储结构和逻辑结构,存储结构通常把堆(二叉树)用数组来存储,逻辑结构则是按照二叉树的模样展示,如图:

(上面逻辑结构结点相连,忘记连了,不好意思)

堆的实现:

堆是由数组构成,我们首先需创建一个数组,我们以建小堆为例,我们需要通过我们需要进行向下调整,但我们调整时需满足一个前提——左右子树是堆,并都为小堆

向下调整法:

怎么调?我们可以观察下面这张图(假设数组int a[6] = {8,2,5,6,7,4}):

由上图可知,我们先找比较根结点的左右孩子大小,让小的孩子再与父亲大小比较

若小的孩子比父亲小,则进行位置交换,并将原来孩子的位置当成父亲继续往下比较

若小的孩子比父亲大,则不做处理

void Swap(int* p, int* q)//交换值
{int tmp = *p;*p = *q;*q = tmp;
}
void Adjustdown(int* a, int n, int parent)
{int child = 2 * parent - 1;if (a[child] > a[child + 1])//选出较小的孩子{++child;}while (child < n){if (a[parent] > a[child])//父亲与孩子比较{Swap(&a[parent], &a[child]);//更换父结点的位置parent = child;child = 2 * parent - 1;}else{break;}}
}

但这个有局限性,左右子树需为小堆或大堆,随便给个数组,我们又该怎样建堆呢?我们可以找到最后一个非叶子的数,然后从下往上依次向下调整,如图(以升序建大堆为例):

for (int i = (n - 1 - 1) / 2; i >= 0; i--)建大堆
{Adjustdown(php->a, php->size, i);
}

向上调整法:

当我们需要插入一个数据(叶结点)时,需要对堆进行调整,使其满足堆的条件,我们需要用到向上调整法,如图(建小堆为例):

首先将要插入的结点和它所属的父结点进行比较

若要插入的结点比其父结点小,则交换位置,并将要插入的结点继续向上调整,若要插入的结点比其父结点大,则不再进行处理

void Swap(int* p, int* q)//交换值
{int tmp = *p;*p = *q;*q = tmp;
}
void Adjustup(int* a, int child)
{int parent = (child - 1) / 2;while (child > 0)//孩子为根结点循环终止{if (a[parent] > a[child])//父亲与孩子比较{Swap(&a[parent], &a[child]);//更换父结点的位置child = parent;parent = (child - 1) / 2;}else{break;}}
}

堆的初始化:

我们先需构建一个类型,创建一个动态数组,大小和容量

void HpInit(Hp* php, HpDataType* a, int n)
{assert(php);HpDataType* tmp = (HpDataType*)malloc(sizeof(HpDataType));//开辟空间if (tmp == NULL){perror("malloc fail");return;}a = tmp;php->size = n;//令大小为nphp->capacity = n;
}

堆的插入:

我们先进行尾插,然后前面提到了插入数据需要向上调整,这样不会破坏堆的性质,在向上调整

void CheckCapacity(Hp* php)
{if (php->size == php->capacity){HpDataType* tmp = (HpDataType*)realloc(php->a, sizeof(HpDataType) * php->capacity * 2);//扩容if (tmp == NULL){perror("realloc fail");return;}php->a = tmp;php->capacity *= 2;}
}
void HpInsert(Hp* php, HpDataType x)
{assert(php);//检查容量CheckCapacity(php);//尾插php->a[php->size] = x;php->size++;//向上调整Adjustup(php->a, php->size - 1);
}

堆的删除:

删除是删除堆顶的元素,但不能直接删除,这样会破坏堆的性质,我们要先将堆顶元素与最后一个结点的元素进行交换,然后删除最后一个结点的元素,最后进行向下调整,保证得到一个正确的堆

void HpErase(Hp* php)
{assert(php);if (php->size == 0)//如果堆为空,则不删除return;else{Swap(&php->a[0], &php->a[php->size - 1]);//交换堆顶元素和最后一个元素php->size--;//删除最后一个元素Adjustdown(php->a, php->size - 1, 0);//向下调整}
}

堆的判空和有效个数:

如果堆的大小为0,则说明数组已空了!

bool HpEmpty(Hp* php)//返回数组个数
{assert(php);return php->size == 0;
}
int HpGetSize(Hp* php)
{assert(php);return php->size;//返回个数
}

堆的销毁:

将数据置为0,释放数组开辟的空间,然后置空即可

void HpDestroy(Hp* php)
{assert(php);php->size = 0;php->capacity = 0;free(php->a);//释放开辟的空间php->a = NULL;
}

堆的打印:

因为堆的实际存储是以数组的形式,所以我们只需遍历循环就行了

void HpPrint(Hp* php)
{assert(php);for (int i = 0; i < php->size; i++)//循环遍历{printf("%d ", php->a[i]);}printf("\n");
}

结语:

幸得识卿!

http://www.dtcms.com/wzjs/496949.html

相关文章:

  • 地方网站如何做竞价优化方案怎么写
  • 河南省建设工程标准定额管理网站什么是营销渠道
  • 图书网站建设论文服务营销7p理论
  • 南京网站设计制作公司排名榜网络舆情监测中心
  • 网站开发需求用什么软件沈阳seo关键词排名优化软件
  • 网络营销产品有哪些特点网站seo优化怎么做
  • 个人能做网站吗石家庄百度快照优化排名
  • wordpress做网站过程免费seo
  • 网站优化标题seo是什么服务器
  • 做的网站百度搜不到公司想做网络推广贵不
  • 常州地区网页制作公司昆明排名优化
  • 网上外贸网站怎么做百度网盘怎么提取别人资源
  • 正能量不良网站直接进入网站seo关键词优化排名
  • 抖音网站建设的基本情况渠道网官网
  • 可以做动画的网站有哪些关键词首页优化
  • 教育网站建设做排名优化
  • 越秀做网站鞍山seo外包
  • 昆明有哪些帮忙做网站的公司汽车网络营销推广方案
  • tp类似wordpress搜索引擎优化简称
  • 做h5好的网站南昌seo外包公司
  • 网站统计页面模板wordpress建站
  • 深圳app客户端做网站百度关键词如何优化
  • 婚纱摄影网站制作东莞seo外包
  • 网站的建设可以起到什么作用是什么原因网络广告的形式有哪些?
  • WordPress怎么加按钮seo排名平台
  • 网站建设和管理规则佛山网站建设维护
  • adobeXD做网站营销一体化平台
  • 网站建设的策划方案驻马店网站seo
  • 网站建设情况报告seo网站优化收藏
  • 武汉网站制作pc 手机数据分析师要学什么