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

seo比较好的网站南宁网站建站公司

seo比较好的网站,南宁网站建站公司,图片wordpress,高性能网站建设 下载前面我们学过可以把完全二叉树存入到顺序表中,然后利用完全二叉树的情缘关系,就可以通过数组下标来联系。 但是并不是把二叉树存入到数组中就是堆了,要看原原来的二叉树是否满足:所有的父都小于等于子,或者所有的父都…

前面我们学过可以把完全二叉树存入到顺序表中,然后利用完全二叉树的情缘关系,就可以通过数组下标来联系。
在这里插入图片描述
但是并不是把二叉树存入到数组中就是堆了,要看原原来的二叉树是否满足:所有的父都小于等于子,或者所有的父都大于等于子——既小堆大堆
在这里插入图片描述
现在我们用代码来实现数据存入到顺序表中,并且是小堆
首先需要创建一个顺序表的结构体
在这里插入图片描述
然后初始化

void HeapInit(Heap* php)//初始化
{assert(php);php->a = NULL;php->capacity = php->size = 0;
}

放入数据
首先要用指针开辟一块空间并判断是否需要扩容,然后把数据尾插进去

void HeapPush(Heap* php, HpDatatype x)//放入数据
{assert(php);//扩容if (php->capacity == php->size){int newcapacity = php->capacity == 0 ? 4 : php->capacity * 2;HpDatatype* tmp = (HpDatatype*)realloc(php->a, sizeof(HpDatatype)*newcapacity);if (tmp == NULL){perror("realloc fail");exit(-1);}php->a = tmp;php->capacity = newcapacity;}php->a[php->size] = x;php->size++;Adjust(php->a, php->size - 1);//调整
}

但是因为这个数组要满足小堆,所以尾插进去的数还需要进一步的调整
在这里插入图片描述
那么这里的代码是如何实现的呢
在这里插入图片描述

到这里的时候我们没插入一个数据就都可以把数据从新调整为一个堆,那么我们为什么要把数据按照堆的方式存储呢?
现在我们来写一个堆数据删除的代码就能感受到堆的作用:
在这里插入图片描述

void AdiustDown(HpDatatype* a, int n, int parent)
{int child = parent * 2 + 1;//先假设和根交换的是他的左儿子while (child<n)//当child=parent*2+1已经超出了数组的范围,那么就说明他下面已经没有儿子了,此时也是结束循环{if (child+1<n && a[child + 1] < a[child])//如果假设错误,那么就换成右儿子,但是这里要注意的child+1(右儿子)存在{child++;}if (a[child] < a[parent])//判断是否需要换{Swap(&a[child], &a[parent]);//交换//尾下一次循环做准备parent = child;child = parent * 2 + 1;}else//如果不用换就直接跳出循环{break;}}
}void HeapPop(Heap* php)//删除根
{assert(php);assert(php->size>0);Swap(&php->a[0], &php->a[php->size - 1]);//交换php->size--;//尾删//向下调整AdiustDown(php->a, php->size, 0);}

有了这个删根代码,我们在加上取根代码,和判空代码,便可实现数据的排序打印


HpDatatype  HeapTop(Heap* php)//返回根值
{assert(php);assert(php->size > 0);return php->a[0];
}bool HeapEmpty(Heap* php)//判空
{assert(php);return php->size==0;
}
while (!HeapEmpty(&st)){printf("%d ", HeapTop(&st));//打印顶值HeapPop(&st);}

在这里插入图片描述

如果把上面插入数据和删除根向下调整的判断语句的小于改成大于那么就实现了打印出来的数据时从大到小的排序
在这里插入图片描述

这里就体现出了堆的魅力,当一组数据时以堆的形式储存的,那么他在排序的时候的时间复杂度就是
O(logN2),而之前我们学习的冒泡排序的时间复杂度是O(N2),显然堆的排序时间复杂度更低

但是这里平不是用堆来排序的实际用法,因为如果给我们一个数组,进行排序,我们是要实际改变数组里面值的位置,并不是像这里这样pop一次然后取根打印出来,即使我们每次用取出来的根值去覆盖原来的数组,那么我们要用这样的堆就需要写上面所以的建立堆的数据结构代码,显然是太麻烦了。

那么我们是否可以:
在这里插入图片描述
把给的数组变成堆的时候我们就要进行排序,因为这里并没有上面写的数据结构的堆,所以我们无法取根然后再打印,——之前也说了这种方法是不会把原本的数组改变成有有序的,

所以之下要讲的才是如何在把一个数组已经变成堆的情况下进行排序:

降序排序-——恰恰是把数组变成大堆,升序排序恰恰是把数组变成小堆
为什么要这样呢?

在这里插入图片描述
升序代码:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>void Swap(int* child, int* parent)//交换
{int temp = *child;*child = *parent;*parent = temp;
}Adjust(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 = (parent - 1) / 2;}else{break;}}
}AdiustDown(int* a, int n, int parent)//向下调整
{int child = parent * 2 + 1;while (child<n){if (child + 1 < n && a[child + 1] > a[child]){child++;}if (a[child] > a[parent]){Swap(&a[child],&a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}
int main()
{
int arr[] = { 90,56,3,46,1,2,89 };
int n = sizeof(arr) / sizeof(int);
for (int i = 1; i < n; i++)
{Adjust(arr, i);//调整
}
int end = n - 1;//最后一个数的下标
while (end > 0)
{Swap(&arr[0], &arr[end]);//向下调整AdiustDown(arr, end, 0);end--;
}for (int j = 0; j < n; j++)
{printf("%d ", arr[j]);
}return 0;
}

在这里插入图片描述

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

相关文章:

  • 旅游网站建设的相关报价即时通讯网站开发源码
  • 帮人家做网站难吗推广网站利润
  • 南通门户网站建设缤纷销客crm
  • 帝国cms企业门户网站仿站视频教程 网盘深圳专业建站公司有哪些
  • 南京装修公司做网站郑州建设信息网简介
  • 学校专业群建设专题网站社交网络推广方法
  • 网站建设座谈会上的发言企业网站设计推荐
  • 简单易做的网站建网站可行性分析
  • 线上设计师网站国家高新技术企业认定官网
  • php做的网站如何该样式网站速度优化
  • 网站开发服务 税怎样找素材做网站
  • 济南网站建设 刘彬彬wordpress大开速度慢
  • 淄博网站制作定制优化职业培训机构有哪些
  • 网站费用预算平顶山哪里有做网站的公司
  • 手机网站设计与规划宁波网站优化方法
  • 网站后台登陆显示验证码错误网络seo优化
  • 零食网站建设策划书传媒公司怎么套路新人
  • wordpress主题制作的书关键词推广seo
  • 做网站外网可访问网络营销组织是什么
  • wordpress个人网站模板怎么通过微博做网站外链
  • wordpress网站百度收录首页线上编程课哪家好
  • 建设网站企业注册人员北京朝阳不限购小户型
  • 什么网站做美式软装设计网站开发培训班 上地
  • 怎么做自己的设计网站哪里可以免费申请空间 注册域名 申请网站
  • 做有色金属哪个网站好哈尔滨高端网页设计
  • 手机号电子邮箱免费注册seo网站设计就业前景
  • 做网站宣传公众号开发哪家好
  • 青岛高新区建设局网站优化大师app下载安装
  • 企业网站建设方案书怎么写做校园网站
  • 深圳 高端 建站公司ui设计师需要考什么证书