本文介绍: 那今天讨论就到这里喽!不知道大家是否有所收获呢?可以自己的疑问发在评论区!

Hello everybody!今天打算给大家介绍一个功能较强大的数据结构的基础,它不仅具有很高的应用价值而且排序效率很高。冒泡排序知道叭,它的时间复杂度为O(n^2),而堆排序时间复杂度为O(n*logn)。堆排序直接碾压冒泡排序。在c语言阶段,我曾给过大家qsort函数模拟实现代码,我是以冒泡排序底层逻辑实现的:时间复杂度为O(n^2)。而真正库文件中的qsort是以快排为底层逻辑实现的:时间复杂度为O(n*logn)。所以当我们排较长的数值时,肉眼可见的会发现自己模拟实现qsort效率远远不及库文件中的qsort。这就很好的体现了时间复杂度为O(n*logn)的数据结构的魅力所在!那好,废话不多说,我们直接开始叭!

二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构

顺序结构存储就是使用数组存储,一般使用数组只适合完全二叉树,因为不是完全二叉树会有空间浪费。而现实中只有堆才会使用数组存储二叉顺序存储物理上是一个数组,在逻辑上是一颗二叉树。

二叉树的链式存储结构是指,用链表表示一颗二叉树,即用链来指示元素逻辑关系。通常的方法链表每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点孩子和右孩子所在的链结点的存储地址链式结构分为二叉链和三叉链。在当前知识借助一般都是二叉链,后面的高阶数据结构红黑树等会用到三叉链。

#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <stdbool.h>

typedef int HPDataType;
typedef struct Heap {
	HPDataType* a;
	int size;
	int capacity;
}HP;
void HeapInit(HP* php);
void HeapDestroy(HP* php);
void HeapPush(HP* php, HPDataType x);//插入数据向上调整调整
void HeapPop(HP* php);//删除堆顶(根节点int HeapSize(HP* php);
HPDataType HeapTop(HP* php);
bool HeapEmpty(HP* php);
void HeapInit(HP* php) {
	assert(php);//检查php是否为空指针
	php->a = NULL;
	php->size = php->capacity = 0;
}

void HeapDestroy(HP* php) {
	assert(php);
	free(php->a);//将a指向动态空间还给操作系统
	php->a = NULL;//置空,避免出现指针
	php->size = php->capacity = 0;
}

2.在AdjustUp中,可以通过节点找父节点,如果不满足小堆规则,那么父节点数值和子节点的数值交换然后下标继续向上调整。直到子节点的下标为零(到达根结点时)结束

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注