c语言查找队列中找最小值,最小堆 / 优先队列(C语言实现)

本文介绍了如何使用C语言实现最小堆,包括初始化、销毁、插入、删除最小值等操作。通过数组实现,详细展示了最小堆的插入和下滤、删除和上滤过程,并提供了建堆和查找堆中第k大元素的示例代码。
摘要由CSDN通过智能技术生成

最近找实习,复习下数据结构方面的内容。

完全二叉树有两种形态,一种是:二叉树的所有子树要么没有孩子,要么一定有左孩子。另一种是:二叉树要么没有子树,要么一定左右子树都有。

堆是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于(或不小于)其左孩子和右孩子节点的值。

最大堆和最小堆是二叉堆的两种形式。

最大堆:根结点的键值是所有堆结点键值中最大者。

最小堆:根结点的键值是所有堆结点键值中最小者。

在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高进先出 (largest-in,first-out)的行为特征。优先队列常用于模拟操作系统的进程调度,可以用堆来实现。

下面我们用数组来实现一个最小堆。

代码如下:

MinHeap.h

#ifndef DataStructures_MinHeap_h

#define DataStructures_MinHeap_h

struct MinHeap;

typedef struct MinHeap * MinPriorityQueue;

typedef int ElementType;

// 初始化堆

MinPriorityQueue initialize(int maxElements);

// 销毁堆

void destroy(MinPriorityQueue pqueue);

// 清空堆中的元素

void makeEmpty(MinPriorityQueue pqueue);

// 插入操作

void insert(ElementType x, MinPriorityQueue pqueue);

// 删除最小者操作,返回被删除的堆顶元素

ElementType deleteMin(MinPriorityQueue pqueue);

// 查找最小者(堆顶)

ElementType findMin(MinPriorityQueue pqueue);

// 判断堆是否为空

int isEmpty(MinPriorityQueue pqueue);

// 判断堆是否满

int isFull(MinPriorityQueue pqueue);

// 通过一个数组来建堆,相当于将用数组实现的无序树转换为堆序树

MinPriorityQueue buildHeap_insert(int *arr, int n);

MinPriorityQueue buildHeap_percolate(int *arr, int n);

// 打印堆

void printMinPriorityQueue(MinPriorityQueue pqueue);

#endif

MinHeap.c

#include

#include

#include "MinHeap.h"

/* 标记节点,类似于链表中的表头节点

* 该值必须小于所有最小堆中的元素,设其值为-1

*/

#define SentinelElement -1

/*

* 使用数组实现堆

*

* capacity 数组的最大容量

* size 数组的长度

* elements 堆中的元素存放的数组

*/

struct MinHeap

{

int capacity;

int size;

ElementType *elements; // 堆的元素个数为size,实际上用来存储的数组的长度为size + 1,还包括一个sentinel元素

};

void

PQueueNULLWarning()

{

printf("Warning: Minimum Priority Q

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值