【数据结构 —— 堆的实现(顺序表)】

news/2024/10/23 8:29:07/

数据结构 —— 堆的实现(顺序表)

  • 一.堆
    • 1.1堆的定义及结构
      • 1.1.1.堆的定义
      • 1.1.2.堆的性质
      • 1.1.3.堆的结构
  • 二.堆的实现
    • 2.1.头文件的实现 —— (Heap.h)
    • 2.2.源文件的实现 —— (Heap.c)
      • 2.2.1.小堆的源文件
      • 2.2.2.大堆的源文件
    • 2.3.源文件的实现 —— (test.c)
  • 三.实际数据测试展示
    • 3.1.插入数据
      • 3.1.1.小堆插入 ——(调试窗口展示)
      • 3.1.2.大堆插入 ——(调试窗口展示)
    • 3.2 打印前k个最值 ——(小型top-k问题)
      • 3.2.1.小堆打印前k个最小值 —— (运行展示)
      • 3.2.2.大堆打印前k个最大值 —— (运行展示)
    • 3.3简单类堆排序 ——(非真堆排序)
      • 3.3.1.类小堆排序 ——(运行展示)
      • 3.3.2.类大堆排序 ——(运行展示)

一.堆

1.1堆的定义及结构

1.1.1.堆的定义

堆就是以二叉树的顺序存储方式来存储元素,同时又要满足父亲结点存储数据都要大于儿子结点存储数据(也可以是父亲结点数据都要小于儿子结点数据)的一种数据结构。堆只有两种即大堆和小堆,大堆就是父亲结点数据大于儿子结点数据,小堆则反之。

1.1.2.堆的性质

堆中某个节点的值总是不大于或不小于其父节点的值;
堆总是一棵
完全二叉树。

1.1.3.堆的结构

用图画展示就如下图所示:
(1).小堆展示

在这里插入图片描述
(2).大堆展示
在这里插入图片描述

二.堆的实现

2.1.头文件的实现 —— (Heap.h)

Heap.h
#pragma once#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.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);
//获取堆顶元素
HPDataType HeapTop(HP* php);
//判空/统计堆内元素个数
bool HeapEmpty(HP* php);
int HeapSize(HP* php);

2.2.源文件的实现 —— (Heap.c)

2.2.1.小堆的源文件

Heap.c
#include"Heap.h"//小堆
//创建/销毁
void HeapInit(HP* php)
{assert(php);php->a = NULL;php->size = 0;php->capacity = 0;
}
void HeapDestroy(HP* php)
{assert(php);free(php->a);php->a = NULL;php->size = php->capacity = 0;
}//交换函数
void Swap(HPDataType* p1, HPDataType* p2)
{HPDataType tmp = *p1;*p1 = *p2;*p2 = tmp;
}//向上调整函数
void AdJustUp(HPDataType* a, int child)
{int parent = (child - 1) / 2;while (child > 0){if (a[child] < a[parent]){Swap(&a[child], &a[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}
//插入/删除
void HeapPush(HP* php, HPDataType x)
{assert(php);if (php->size == php->capacity)//判断数组空间不够就扩容{int newcapacity = php->capacity == 0 ? 4 : php->capacity * 2;HPDataType* tmp = (HPDataType*)realloc(php->a, newcapacity * sizeof(HPDataType));if (tmp == NULL){perror("realloc fail");exit(-1);}php->a = tmp;php->capacity = newcapacity;}php->a[php->size] = x;php->size++;AdJustUp(php->a, php->size - 1);}
//向下调整函数
void AdJustDown(HPDataType* 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[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}
void HeapPop(HP* php)
{assert(php);Swap(&php->a[0], &php->a[php->size - 1]);php->size--;AdJustDown(php->a, php->size, 0);
}
//获取堆顶元素
HPDataType HeapTop(HP* php)
{assert(php);assert(php->size > 0);return php->a[0];}
//判空/统计堆内元素个数
bool HeapEmpty(HP* php)
{assert(php);return php->size == 0;
}
int HeapSize(HP* php)
{assert(php);assert(php->size > 0);return php->size;
}

2.2.2.大堆的源文件

Heap.h
#include"Heap.h"//大堆
//创建/销毁
void HeapInit(HP* php)
{assert(php);php->a = NULL;php->size = 0;php->capacity = 0;
}
void HeapDestroy(HP* php)
{assert(php);free(php->a);php->a = NULL;php->size = php->capacity = 0;
}//交换函数
void Swap(HPDataType* p1, HPDataType* p2)
{HPDataType tmp = *p1;*p1 = *p2;*p2 = tmp;
}//向上调整函数
void AdJustUp(HPDataType* a, int child)
{int parent = (child - 1) / 2;while (child > 0){if (a[child] > a[parent]){Swap(&a[child], &a[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}
//插入/删除
void HeapPush(HP* php, HPDataType x)
{assert(php);if (php->size == php->capacity)//判断数组空间不够就扩容{int newcapacity = php->capacity == 0 ? 4 : php->capacity * 2;HPDataType* tmp = (HPDataType*)realloc(php->a, newcapacity * sizeof(HPDataType));if (tmp == NULL){perror("realloc fail");exit(-1);}php->a = tmp;php->capacity = newcapacity;}php->a[php->size] = x;php->size++;AdJustUp(php->a, php->size - 1);}
//向下调整函数
void AdJustDown(HPDataType* 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[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}
void HeapPop(HP* php)
{assert(php);Swap(&php->a[0], &php->a[php->size - 1]);php->size--;AdJustDown(php->a, php->size, 0);
}
//获取堆顶元素
HPDataType HeapTop(HP* php)
{assert(php);assert(php->size > 0);return php->a[0];}
//判空/统计堆内元素个数
bool HeapEmpty(HP* php)
{assert(php);return php->size == 0;
}
int HeapSize(HP* php)
{assert(php);assert(php->size > 0);return php->size;
}

2.3.源文件的实现 —— (test.c)

test.c
#include"Heap.h"//小堆
int main()
{HP ph;HeapInit(&ph);int a[] = { 4,6,2,1,5,8,2,9};for (int i = 0; i < (sizeof(a) / sizeof(int)); i++){HeapPush(&ph, a[i]);//插入}//获取前k个最小值/*int k = 3;while (k--){printf("%d\n", HeapTop(&ph));HeapPop(&ph);}*///小堆排序while (!HeapEmpty(&ph)){printf("%d ", HeapTop(&ph));HeapPop(&ph);}return 0;
}//大堆
//int main()
//{
//	HP ph;
//	HeapInit(&ph);
//	int a[] = { 4,6,2,1,5,8,2,9 };
//	for (int i = 0; i < (sizeof(a) / sizeof(int)); i++)
//	{
//		HeapPush(&ph, a[i]);
//	}
//	//前k个最大值
//	/*int k = 3;
//	while (k--)
//	{
//		printf("%d\n", HeapTop(&ph));
//		HeapPop(&ph);
//	}*/
//	//大堆排序
//	while(!HeapEmpty(&ph))
//	{
//		printf("%d ", HeapTop(&ph));
//		HeapPop(&ph);
//	}
//	return 0;
//}

三.实际数据测试展示

3.1.插入数据

3.1.1.小堆插入 ——(调试窗口展示)

在这里插入图片描述

3.1.2.大堆插入 ——(调试窗口展示)

在这里插入图片描述

3.2 打印前k个最值 ——(小型top-k问题)

3.2.1.小堆打印前k个最小值 —— (运行展示)

在这里插入图片描述

3.2.2.大堆打印前k个最大值 —— (运行展示)

在这里插入图片描述

3.3简单类堆排序 ——(非真堆排序)

3.3.1.类小堆排序 ——(运行展示)

在这里插入图片描述

3.3.2.类大堆排序 ——(运行展示)

在这里插入图片描述


http://www.ppmy.cn/news/1239339.html

相关文章

【LM、LLM】浅尝二叉树在前馈神经网络上的应用

前言 随着大模型的发展&#xff0c;模型参数量暴涨&#xff0c;以Transformer的为组成成分的隐藏神经元数量增长的越来越多。因此&#xff0c;降低前馈层的推理成本逐渐进入视野。前段时间看到本文介绍的相关工作还是MNIST数据集上的实验&#xff0c;现在这个工作推进到BERT上…

ECharts与Excel的结合实战

引言&#xff1a;本文是一篇ECharts和Excel实战的记录。将Excel与ECharts产生火花&#xff0c;从Excel读取数据然后在ECharts上展示。 1.柱状图前端代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title…

C#串口通信从入门到精通(27)——高速通信下解决数据处理慢的问题(20ms以内)

前言 我们在开发串口通信程序时,有时候会遇到比如单片机或者传感器发送的数据速度特别快,比如10ms、20ms发送一次,并且每次发送的数据量还比较大,如果按照常规的写法,我们会发现接收的数据还没处理完,新的数据又发送过来了,这就会导致处理数据滞后,软件始终处理的不是…

科普:多领域分布式协同仿真

分布式协同仿真是一种在分布式计算环境中进行协同工作的仿真方法。使用该方法进行协同仿真时&#xff0c;仿真任务将被分发到多个计算节点上&#xff0c;并且这些节点可以同时工作以模拟完整的系统行为。分布式协同仿真已被广泛应用于工程、科学和军事领域&#xff0c;以便更好…

16.Python 多进程和多线程

进程是应用程序正在执行的实体&#xff0c;当程序执行时&#xff0c;也就创建了一个主线程。进程在创建和执行需要占用一定的资源&#xff0c;如内存、文件、I/O设备等。 线程是CPU使用的基本单元&#xff0c;由主线程创建&#xff0c;并使用这个进程的资源&#xff0c;因此线…

pytest调用其他测试用例方法

pytest调用其他测试用例方法 一. 第一种方法&#xff0c;测试用例前置pytest.fixture() def test1():print("我是用例一") pytest.fixture(test1) def test2():print("我是用例二")二.第二种方法,如果不是同一文件中测试用例调用或者同一py文件中 def t…

MMFN-AL

MMFN means ‘multi-modal fusion network’ 辅助信息 作者未提供代码

element plus中表格的合计属性和例子

在 element plus 表格中&#xff0c;您可以使用 summary-method 属性来指定一个函数&#xff0c;计算表格中列的合计或平均值等。该函数应该返回一个对象&#xff0c;其中包含每个列的合计值。例如&#xff0c;如果您的表格数据是这样的&#xff1a; [{ name: John, age: 20, …