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

jquery 网站后台模板怎么自己做五合一网站

jquery 网站后台模板,怎么自己做五合一网站,专业的企业宣传片拍摄公司,版面设计网站有哪些个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》 文章目录 一、堆二、实现思路1. 结构的定义2. 堆的构建 (HeapInit)3. 堆的销毁 (HeapDestroy)4. 堆的插入 (HeapPush)5. 堆的删除 (HeapPop)6. 取堆顶的数据 (HeapTop)7. 堆的数据个数 (HeapSize…

在这里插入图片描述

个人主页 : 个人主页
个人专栏 : 《数据结构》 《C语言》

文章目录

  • 一、堆
  • 二、实现思路
    • 1. 结构的定义
    • 2. 堆的构建 (HeapInit)
    • 3. 堆的销毁 (HeapDestroy)
    • 4. 堆的插入 (HeapPush)
    • 5. 堆的删除 (HeapPop)
    • 6. 取堆顶的数据 (HeapTop)
    • 7. 堆的数据个数 (HeapSize)
    • 8. 堆的判空 (HeapEmpty)
  • 三、代码实现
  • 总结


一、堆

当一颗完全二叉树用顺序表来存储时,其被称为堆。

  • 堆总是一棵完全二叉树
  • 堆的某个节点的值总是不大于(大堆)或不小于(小堆)其父节点的值

其可以被用来解决top k 问题 或 堆排序
在这里插入图片描述

下面就是要实现的堆的功能 重点在于堆的插入堆的删除


//堆的构建
void HeapInit(Heap* hp);//堆的销毁
void HeapDestroy(Heap* hp);//堆的插入
void HeapPush(Heap* hp, HPDataType x);//堆的删除
void HeapPop(Heap* hp);//取堆顶的数据
HPDataType HeapTop(Heap* hp);//堆的数据个数
int HeapSize(Heap* hp);//堆的判空
bool HeapEmpty(Heap* hp);

二、实现思路

下部分的图,都以逻辑结构为主!!!
这里构建的是小堆。

1. 结构的定义

堆就是用顺序表来存储一颗完全二叉树,那么堆的结构就与顺序表的结构相同。
一个指向动态开辟空间的指针(data),一个变量记录空间大小(capacity),一个变量记录空间中有效数据(size)。

typedef int HPDataType;typedef struct Heap
{HPDataType* data;int capacity;int size;
}Heap;

2. 堆的构建 (HeapInit)

malloc一块空间,用data记录其地址,capacity记录此时空间大小,size置0(此时空间内无有效数据)。

//堆的构建
#define SIZE 4void HeapInit(Heap* hp)
{assert(hp);hp->data = (HPDataType*)malloc(sizeof(HPDataType) * SIZE);if (hp == NULL) {perror("mallo: ");exit(-1);}hp->capacity = SIZE;hp->size = 0;
}

3. 堆的销毁 (HeapDestroy)

free掉动态开辟的空间,使capacity 和 size 置 0(此时空间大小为0)

//堆的销毁
void HeapDestroy(Heap* hp)
{assert(hp);free(hp->data);hp->data = NULL;hp->capacity = hp->size = 0;
}

4. 堆的插入 (HeapPush)

将数据插入到堆的尾部(最后一个子节点后),然后与其父节点相比较,如果该节点小于其父节点(这里是小堆),交换两个节点的值,直到该节点为堆顶或其父节点小于该节点。

  • 假设该节点下标是 i,那么其父节点的小标是 ( i - 1 ) / 2

在这里插入图片描述

//交换
void swap(HPDataType* a, HPDataType* b)
{HPDataType tmp = *a;*a = *b;*b = tmp;
}//向上调整 假设该节点是 i,父节点是 (i - 1) / 2
void AdjustUp(HPDataType* data, int child)
{int parent = (child - 1) / 2;while (child > 0){if (data[child] < data[parent]){swap(&data[child], &data[parent]);child = parent;parent = (child - 1) / 2;}else {break;}}
}//堆的插入
void HeapPush(Heap* hp, HPDataType x)
{assert(hp);//检查容量if (hp->capacity == hp->size){HPDataType* tmp = (HPDataType*)realloc(hp->data ,sizeof(HPDataType) * (hp->capacity * 2));if (tmp == NULL){perror("realloc:");exit(-1);}hp->data = tmp;hp->capacity *= 2;}hp->data[hp->size] = x;hp->size++;//向上调整   传入数组和出入数据的下标//此处是小堆AdjustUp(hp->data, hp->size - 1);
}

5. 堆的删除 (HeapPop)

堆的删除是删除堆顶数据。
堆顶数据和堆的尾部数据交换,size 减一,然后将新的堆顶数据与其左右孩子节点的最小值比较,如果新堆顶数据大于左右孩子节点的最小值,交换数据,再次与新的左右孩子节点的最小值
比较。直到该数据小于左右孩子的最小值,或该数据超出有效数据范围。

  • 假设某个节点的下标是 i,其左孩子节点的下标:i * 2 + 1,其右孩子的下标:i * 2 + 2
  • 删除堆顶数据,不能挪到数据将堆顶数据覆盖。如果挪到数据,那么兄弟节点可能会变成父子节点,而兄弟节点之间并不保证大小关系,可能会破坏堆的结构(这里是会破坏小堆结构)。

在这里插入图片描述

//交换
void swap(HPDataType* a, HPDataType* b)
{HPDataType tmp = *a;*a = *b;*b = tmp;
}//向下调整,假设该节点是 i, 右孩子节点是 2 * i + 1,左孩子节点是 2 * i + 2
void AdjustDown(HPDataType* data, int parent, int size)
{int child = parent * 2 + 1;while (parent < size){//防止越界                    找左右孩子中最小的if (child + 1 < size && data[child] > data[child + 1]){child++;}if (child < size && data[parent] > data[child]){swap(&data[parent], &data[child]);parent = child;child = parent * 2 + 1;}else{break;}}
}//堆的删除  首元素 与 尾元素交换,新的堆顶在向下调整
void HeapPop(Heap* hp)
{assert(hp);assert(!HeapEmpty(hp));hp->data[0] = hp->data[hp->size - 1];hp->size--;//向下调整AdjustDown(hp->data, 0, hp->size);
}

6. 取堆顶的数据 (HeapTop)

读取数组空间下标为0处即可。

//取堆顶的数据
HPDataType HeapTop(Heap* hp)
{assert(hp);return hp->data[0];
}

7. 堆的数据个数 (HeapSize)

堆的结构中size表示此时堆中有效数据的个数,访问size即可。

//堆的数据个数
int HeapSize(Heap* hp)
{assert(hp);return hp->size;
}

8. 堆的判空 (HeapEmpty)

size表示堆的有效数据个数,如果size == 0,表示堆为空。

//堆的判空
bool HeapEmpty(Heap* hp)
{assert(hp);return hp->size == 0;
}

三、代码实现

//Heap.c   文件#include "Heap.h"//堆的构建
void HeapInit(Heap* hp)
{assert(hp);hp->data = (HPDataType*)malloc(sizeof(HPDataType) * SIZE);if (hp == NULL) {perror("mallo: ");exit(-1);}hp->capacity = SIZE;hp->size = 0;
}//堆的销毁
void HeapDestroy(Heap* hp)
{assert(hp);free(hp->data);hp->data = NULL;hp->capacity = hp->size = 0;
}//交换
void swap(HPDataType* a, HPDataType* b)
{HPDataType tmp = *a;*a = *b;*b = tmp;
}//向上调整 假设该节点是 i,父节点是 (i - 1) / 2
void AdjustUp(HPDataType* data, int child)
{int parent = (child - 1) / 2;while (child > 0){if (data[child] < data[parent]){swap(&data[child], &data[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}//堆的插入
void HeapPush(Heap* hp, HPDataType x)
{assert(hp);//检查容量if (hp->capacity == hp->size){HPDataType* tmp = (HPDataType*)realloc(hp->data ,sizeof(HPDataType) * (hp->capacity * 2));if (tmp == NULL){perror("realloc:");exit(-1);}hp->data = tmp;hp->capacity *= 2;}hp->data[hp->size] = x;hp->size++;//向上调整   传入数组和出入数据的下标//此处是小堆AdjustUp(hp->data, hp->size - 1);
}//向下调整,假设该节点是 i, 右孩子节点是 2 * i + 1,左孩子节点是 2 * i + 2
void AdjustDown(HPDataType* data, int parent, int size)
{int child = parent * 2 + 1;while (parent < size){//防止越界                    找左右孩子中最小的if (child + 1 < size && data[child] > data[child + 1]){child++;}if (child < size && data[parent] > data[child]){swap(&data[parent], &data[child]);parent = child;child = parent * 2 + 1;}else{break;}}
}//堆的删除  首元素 与 尾元素交换,新的堆顶在向下调整
void HeapPop(Heap* hp)
{assert(hp);assert(!HeapEmpty(hp));hp->data[0] = hp->data[hp->size - 1];hp->size--;//向下调整AdjustDown(hp->data, 0, hp->size);
}//取堆顶的数据
HPDataType HeapTop(Heap* hp)
{assert(hp);return hp->data[0];
}//堆的数据个数
int HeapSize(Heap* hp)
{assert(hp);return hp->size;
}//堆的判空
bool HeapEmpty(Heap* hp)
{assert(hp);return hp->size == 0;
}
//Heap.h  文件#pragma once#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>#define SIZE 4typedef int HPDataType;typedef struct Heap
{HPDataType* data;int capacity;int size;
}Heap;//堆的构建
void HeapInit(Heap* hp);//堆的销毁
void HeapDestroy(Heap* hp);//堆的插入
void HeapPush(Heap* hp, HPDataType x);//堆的删除
void HeapPop(Heap* hp);//取堆顶的数据
HPDataType HeapTop(Heap* hp);//堆的数据个数
int HeapSize(Heap* hp);//堆的判空
bool HeapEmpty(Heap* hp);

总结

以上就是我对于堆的实现!!!
在这里插入图片描述

http://www.yayakq.cn/news/969705/

相关文章:

  • 网页建设与网站设计大连公交app
  • 做电影网站侵权关注公众号在哪里查找
  • 上海外贸建站推广公司wordpress 调用文章分类
  • 杭州做公司网站哪家好php 网站反盗链
  • icp备案添加网站dw软件破解版
  • 中移建设有限公司网站梧州做网站的公司
  • 闵行做网站公司网站建设趣味解读
  • 青岛建设网站设计公司普通网站建设多少钱
  • 设计类网站排名长沙网站建设王道下拉棒
  • 做网站项目实例域名推荐
  • 金融网站框架模板下载安装网站建设参考文献英文书籍
  • 新开传奇网站发布网孞工业设计公司logo
  • 全屏网站模版怎么登录微信小程序平台
  • 手机网站宽度多少合适做网站时如何去掉网站横条
  • 长沙网站优化外包失信人员黑名单查询
  • 清远做网站的公司WordPress仿站助手
  • 快速建站教程网爱拍怎么创建wordpress
  • 深圳华南城网站建设上海网站平台建设
  • 怎么上传网站程序wordpress文章分页代码
  • 泉州网站建设网络推广移动网站建设流程
  • 台州集团网站建设做门户网站开发的技术
  • 营销型网站有那些网站北京通州网站设计公司
  • 做网站自己装服务器桥梁建设杂志有假网站吗
  • 做问卷的几个网站网级移动营销app下载
  • 东莞网站se印刷网站源码
  • 甘肃网站备案审核时间企业网站需要多少钱
  • 成都定制网站建设四川成都进出口贸易公司
  • 网站建设需要确定的问题优设网站怎么下载
  • 英文营销型网站建设萧山建设银行招聘网站
  • 办公室门户网站建设和管理工作做外贸公司网站怎么做