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

定制手机网站2022适合小学生的简短新闻

定制手机网站,2022适合小学生的简短新闻,怎么做动漫网站,电子商务网站项目计划详解小白如何使用C语言实现堆数据结构 “痛”撕堆排序~😎 前言🙌什么是堆?堆的概念及结构 堆的性质:堆的实现堆向下调整算法画图分析:堆向下调整算法源代码分享:向下调整建小堆向下调整建大堆 堆向上调整算…

详解小白如何使用C语言实现堆数据结构 + “痛”撕堆排序~😎

  • 前言🙌
  • 什么是堆?
    • 堆的概念及结构
  • 堆的性质:
    • 堆的实现
      • 堆向下调整算法
      • 画图分析:
        • 堆向下调整算法源代码分享:
          • 向下调整建小堆
          • 向下调整建大堆
        • 堆向上调整算法源代码分享:
        • 画图分析:
          • 向上调整建小堆
          • 向上调整建大堆
    • C语言整体实现堆数据结构源代码分享
      • 堆的插入:
      • 堆的删除:
        • 画图分析:
      • 头文件(Heap.h)编写:
      • 功能文件(Heap.c)编写:
      • 测试文件(test.c)编写:
      • 运行结果测试截图:
  • 总结撒花💞

追梦之旅,你我同行

   
😎博客昵称:博客小梦
😊最喜欢的座右铭:全神贯注的上吧!!!
😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主!

😘博主小留言:哈喽!😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不多说,文章推上!欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘
在这里插入图片描述

前言🙌

    哈喽各位友友们😊,我今天又学到了很多有趣的知识现在迫不及待的想和大家分享一下!😘我仅已此文,手把手带领大家追梦之旅【数据结构篇】——详解小白如何使用C语言实现堆数据结构~ 都是精华内容,可不要错过哟!!!😍😍😍

什么是堆?

堆的概念及结构

如果有一个关键码的集合K = { , , ,…, },把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:

  1. 父结点的值都大于孩子结点的值,则称为大堆;
  2. 父结点的值都小于孩子结点的值,则称为小堆;
    大堆也称为大根堆,小堆也叫做小根堆。

堆的性质:

  • 堆中某个节点的值总是不大于或不小于其父节点的值;
  • 堆总是一棵完全二叉树。
    在这里插入图片描述

在这里插入图片描述

堆的实现

堆向下调整算法

现在我们给出一个数组,逻辑上看做一颗完全二叉树。我们通过从根节点开始的向下调整算法可以把它调整成一个小堆。向下调整算法有一个前提:左右子树必须是一个堆,才能调整

画图分析:

在这里插入图片描述
在这里插入图片描述

堆向下调整算法源代码分享:

向下调整建小堆
//向下调整--建小堆
void AdjustDown(int* a, int size, int parent)
{int child = parent * 2 + 1;while (child < size){if (child + 1 < size && a[child + 1] < a[child]){child++;}if (a[child] < a[parent]){Swap(&(a[parent]), &(a[child]));parent = child;child = parent * 2 + 1;}else{break;}}
}
向下调整建大堆
//建大堆
void AdjustDown(int* a, int size, int parent)
{int child = parent * 2 + 1;while (child < size){if (child + 1 < size && a[child + 1] > a[child]){child++;}if (a[child] > a[parent]){Swap(&(a[parent]), &(a[child]));parent = child;child = parent * 2 + 1;}else{break;}}
}

堆向上调整算法源代码分享:

画图分析:

在这里插入图片描述

在这里插入图片描述

向上调整建小堆
void AdjustUp(HPDataType* a, int child)
{assert(a);while (child > 0){int parent = (child - 1) / 2;if (a[child] < a[parent]){Swap(&(a[child]), &(a[parent]));child = parent;parent = (child - 1) / 2;}else{break;}}
}
向上调整建大堆
//向上调整建大堆
void AdjustUp(HPDataType* a, int child)
{assert(a);while (child > 0){int parent = (child - 1) / 2;if (a[child] > a[parent]){Swap(&(a[child]), &(a[parent]));child = parent;parent = (child - 1) / 2;}else{break;}}
}

C语言整体实现堆数据结构源代码分享

堆的插入:

先插入一个10到数组的尾上,再进行向上调整算法,直到满足堆。
在这里插入图片描述

void HeapPush(HP* php, HPDataType x)
{assert(php);//扩容if (php->capacity == php->size){int newcapacity = php->capacity == 0 ? 4 : php->capacity * 2;HPDataType* tem = (HPDataType*)realloc(php->a, sizeof(HPDataType) * newcapacity);if (tem == NULL){printf("realloc fail\n");exit(-1);}php->a = tem;php->capacity = newcapacity;}php->a[php->size] = x;//向上调整--建小堆if(php->size > 0)AdjustUp(php->a, php->size);php->size++;	
}

堆的删除:

删除堆是删除堆顶的数据,将堆顶的数据和最后一个数据一换,然后删除数组最后一个数据,再进行向下调整算法。

画图分析:

在这里插入图片描述

void HeapPop(HP* php)
{assert(php);assert(!HeapEmpty(php));Swap(&(php->a[0]), &(php->a[php->size - 1]));php->size--;AdjustDwon(php->a, php->size,0);
}

头文件(Heap.h)编写:

#pragma once#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int HPDataType;typedef struct Heap
{HPDataType* a;int size;int capacity;
}HP;
void Swap(HPDataType* p1, HPDataType* p2);
// O(logN)
void AdjustDwon(HPDataType* a, int size, int parent);
void AdjustUp(HPDataType* a, int child);void HeapPrint(HP* php);
void HeapInit(HP* php);
void HeapDestroy(HP* php);
void HeapPush(HP* php, HPDataType x);
void HeapPop(HP* php);
HPDataType HeapTop(HP* php);
bool HeapEmpty(HP* php);
int HeapSize(HP* php);

功能文件(Heap.c)编写:

#define _CRT_SECURE_NO_WARNINGS 1#include"Heap.h"void Swap(HPDataType* p1, HPDataType* p2)
{int tem = *p1;*p1 = *p2;*p2 = tem;
}
// O(logN)
//建小堆
void AdjustDwon(HPDataType* a, int size, int parent)
{assert(a);int child = parent * 2 + 1;while (child < size){//选出最小的那个if (child + 1 < size && a[child + 1] < a[child]){child++;}if (a[child] < a[parent] ){Swap(&(a[parent]), &(a[child]));parent = child;child = parent * 2 + 1;}else{break;}}
}
void AdjustUp(HPDataType* a, int child)
{assert(a);while (child > 0){int parent = (child - 1) / 2;if (a[child] < a[parent]){Swap(&(a[child]), &(a[parent]));child = parent;parent = (child - 1) / 2;}else{break;}}
}void HeapPrint(HP* php)
{assert(php);for (int i = 0; i < php->size; i++){printf("%d ", php->a[i]);}printf("\n");
}
void HeapInit(HP* php)
{assert(php);php->a = NULL;php->capacity = php->size = 0;
}
void HeapDestroy(HP* php)
{assert(php);free(php->a);php->a = NULL;php->capacity = php->size = 0;
}
void HeapPush(HP* php, HPDataType x)
{assert(php);//扩容if (php->capacity == php->size){int newcapacity = php->capacity == 0 ? 4 : php->capacity * 2;HPDataType* tem = (HPDataType*)realloc(php->a, sizeof(HPDataType) * newcapacity);if (tem == NULL){printf("realloc fail\n");exit(-1);}php->a = tem;php->capacity = newcapacity;}php->a[php->size] = x;//向上调整--建小堆if(php->size > 0)AdjustUp(php->a, php->size);php->size++;}void HeapPop(HP* php)
{assert(php);assert(!HeapEmpty(php));Swap(&(php->a[0]), &(php->a[php->size - 1]));php->size--;AdjustDwon(php->a, php->size,0);
}HPDataType HeapTop(HP* php)
{assert(php);assert(!HeapEmpty(php));return php->a[0];
}
bool HeapEmpty(HP* php)
{assert(php);return php->size == 0;
}
int HeapSize(HP* php)
{assert(php);return php->size;
}

测试文件(test.c)编写:

#define _CRT_SECURE_NO_WARNINGS 1#include"Heap.h"void HeapTest1()
{HP h;HeapInit(&h);HeapPush(&h, 15);HeapPush(&h, 18);HeapPush(&h, 19);HeapPush(&h, 25);HeapPush(&h, 28);HeapPush(&h, 34);HeapPush(&h, 65);HeapPush(&h, 49);HeapPush(&h, 27);HeapPush(&h, 37);HeapPush(&h, 10);printf("%d\n", HeapSize(&h));HeapPrint(&h);for (int i = 0; i < 8; i++){printf("%d ", HeapTop(&h));HeapPop(&h);}printf("\n");HeapDestroy(&h);printf("%d ", HeapTop(&h));HeapPop(&h);
}int main()
{HeapTest1();return 0;
}

运行结果测试截图:

在这里插入图片描述

总结撒花💞

   本篇文章旨在分享详解小白如何使用C语言实现堆数据结构。希望大家通过阅读此文有所收获
   😘如果我写的有什么不好之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘😘😘

http://www.hkea.cn/news/228660/

相关文章:

  • 公司做网站需要给百度交钱吗百度竞价推广方案
  • 网站建设的关键seo推广小分享
  • 写小说的小网站百度关键词排名优化
  • 制作网站的成本规划公司如何建立网站
  • html语言做网站石嘴山网站seo
  • 做最好的言情网站官网seo优化
  • 云南建设监理协会网站营销失败案例分析
  • 怎么样做淘宝优惠券网站搜索引擎营销的优缺点
  • wordpress动态订单seo社区
  • 网站域没到期不能续费吗google谷歌搜索
  • 厦门好的做网站公司网络营销推广方式都有哪些
  • 重庆市建设工程信息官网站自己做网站的流程
  • 网站建设公司怎么做网络营销网站推广
  • 360应用商店seo服务套餐
  • 废橡胶网站建设个人博客网页设计
  • 什么网站做一手项目好域名查询官网
  • 做日用品的要找什么网站好站长工具端口检测
  • 贵州软件开发 网站开发手机版百度一下
  • 企业网站建立答辩问题百度怎么发布广告
  • 温州快建网站地推拉新接单网
  • 濉溪县城乡建设委员会燃气办网站热狗网站排名优化外包
  • 网站能不能自己做免费的seo教程
  • 湖南的商城网站建设优化教程网下载
  • 做网站需要哪些工程师西安seo诊断
  • tp做的网站封装成app2023北京封控了
  • 增城做网站要多少钱推广普通话手抄报
  • 石家庄网站系统开发智能搜索引擎
  • 迅速网站网络营销平台推广方案
  • 学前端要逛那些网站微信引流主动被加软件
  • 韩国flash网站免费手机网站建站平台