C语言实现堆_Y雨何时停T
C语言实现堆...
注:在此各位所达到的是大根堆(即父分支不不大于子分支的堆)
目录
一,堆的解释 二,堆结构类型的开启 三,电源接口体现 1,初始状态化与消毁 2,统计数据的导入与册除 3,任何模块一,堆的介绍
两种结构:
在物理上的结构的上,堆那就是块间断性的存放空间,使用数组 在逻缉机构上,堆是一种棵几乎二叉树两种形式:
大根堆:父分支不少于子分支 小根堆:父网络子域不太于子网络子域二,堆结构的创建
三种成员英文,跳转到数组的指南datas,数字代表数组有效参数数量的size,数字代表数组功率的capacitytypedef int HeapDataType;
typedef struct Heap
{
HeapDataType* datas;
int size;
int capacity;
}Heap;
三,接口实现
1,初始化与销毁
初期化,在操作堆时候,置空堆的班子; 注销,在动用堆后会,挥发的空间,置空堆的班子成员;void HeapInit(Heap* pHeap);
void HeapInit(Heap* pHeap)
{
assert(pHeap != NULL);
pHeap->datas = NULL;
pHeap->size = pHeap->capacity = 0;
}
void HeapDestroy(Heap* pHeap);
void HeapDestroy(Heap* pHeap)
{
assert(pHeap != NULL);
free(pHeap->datas);
pHeap->datas = NULL;
pHeap->size = pHeap->capacity = 0;
}
2,数据的插入与删除
void HeapPush(Heap* pHeap, HeapDataType x);
统计资料复制前先检测储存量是否须得够了,不高则须得扩张,办公空间够了后复制统计资料,但这统计资料的架构有机会不足足堆的规定特殊要求了(大根堆规定特殊要求父接点不值为子接点,新接点有机会不足足这款相互关系),这个时候须得优化(在等你的优化分为向左优化)void HeapPush(Heap* pHeap, HeapDataType x)
{
assert(pHeap != NULL);
HeapCheckCapacity(pHeap);
pHeap->datas[pHeap->size] = x;
AdjustUp(pHeap->datas, pHeap->size);
pHeap->size++;
}
void AdjustUp(HeapDataType* datas, int child)
{
int parent = (child - 1) / 2;
while (child > 0)
{
if (datas[child] > datas[parent])
{
Swap(&datas[child], &datas[parent]);
child = parent;
parent = (child - 1) / 2;
}
else
{
break;
}
}
}
void Swap(HeapDataType* x, HeapDataType* y)
{
HeapDataType temp = *x;
*x = *y;
*y = temp;
}
void HeapCheckCapacity(Heap* pHeap)
{
if (pHeap->size == pHeap->capacity)
{
int newcapacity = 2 * pHeap->capacity;
pHeap->datas = (HeapDataType*)realloc(pHeap->datas, sizeof(HeapDataType) * newcapacity);
assert(pHeap->datas != NULL);
pHeap->capacity = newcapacity;
}
}
void HeapPop(Heap* pHeap);?
注意这里的删除操作,删除的是根节点
堆根点位的清空,先要交換数组首设计和尾设计的数剧显示分析,接下来进行调准(首尾设计数剧显示分析交換后数剧显示分析的形式很有可能未够满足堆的追求),这里的的调准叫作朝下调准void HeapPop(Heap* pHeap)
{
assert(pHeap != NULL);
assert(HeapEmpty(pHeap) != true);
Swap(&(pHeap->datas[0]), &(pHeap->datas[pHeap->size - 1]));
pHeap->size--;
AdjustDown(pHeap->datas, pHeap->size, 0);
}
void Swap(HeapDataType* x, HeapDataType* y)
{
HeapDataType temp = *x;
*x = *y;
*y = temp;
}
void AdjustDown(HeapDataType* datas, int size, int parent)
{
int child = parent * 2 + 1;
while (child < size)
{
if (child + 1 < size && datas[child] < datas[child + 1])
{
child += 1;
}
if (datas[parent] < datas[child])
{
Swap(&datas[parent], &datas[child]);
parent = child;
child = parent * 2 + 1;
}
else
{
break;
}
}
}
3,其他接口
HeapDataType HeapTop(Heap* pHeap);查看根节点数据
HeapDataType HeapTop(Heap* pHeap)
{
return pHeap->datas[pHeap->size - 1];
}
bool HeapEmpty(Heap* pHeap);判断堆是否为空
bool HeapEmpty(Heap* pHeap)
{
return pHeap->size == 0 ? true : false;
}
int HeapSize(Heap* pHeap);查看堆有效数据的多少
int HeapSize(Heap* pHeap)
{
return pHeap->size;
}
皇冠新体育APP相关的文章
- BS版图形系统 - Ribbon工具栏初步_drgraph
- Spring Cloud之Ribbon原理,及RestTemplate启用负载的原理_天涯明月
- Feign-SpringCloud得介绍和应用,结合Hystrix,Ribbon_Hpeacheng
- 算法---LeetCode 528. 按权重随机选择(实战场景: Ribbon 负载均衡)_知北行
- 皇冠新体育APP:SpringCloud-Nacos+Ribbon_dhylanyu1
- 皇冠新体育APP:负载均衡--ribbon、feign_对象
- SpringCloud(11) ?? Ribbon:自定义负载均衡算法_Jzandth
- 【springcloudalibaba】聊一聊已经停更的Ribbon(zcw-demo)【十九】_知识改变命运,?(?°?°?)??【求关注】
- 皇冠新体育APP:Spring Cloud Ribbon负载均衡策略详解_学然后知不足!
- Spring Cloud ?? 负载均衡与 Ribbon 应用_Morty的技术乐园
- Ribbon 使用到原理浅析_Forrest Gump
- SprinCloud的Ribbon中报java.lang.IllegalStateException: No instances available for item-service原因之一_不懂的关
- [享学Ribbon] 十七、Ribbon的LoadBalancer五大组件之:IRule(三)随机和重试,所有IRule实现总结_Java方向盘
- Nocas、Ribbon、Feign、Hystrix、sential学习笔记_一路向北?重庆分伦
- Spring Cloud微服务、eureka注册中心、ribbon负载均衡和重试_xiaolu_0
- 皇冠新体育APP:Ribbon了解与使用_后端程序员的发展史