《数据结构与算法分析(c 描述)》—— 第六章笔记

本文详细介绍了优先队列的概念及其在数据结构中的重要性,特别是通过C语言实现了二叉堆的插入(push)、删除最小元素(pop)和建堆(buildHeap)操作。文中包含每一步的实现步骤、流程图和具体C代码,最后展示了完整的优先队列C++实现及测试结果。
摘要由CSDN通过智能技术生成

一、优先队列

优先队列是允许至少两种操作的数据结构:Insert(插入),DeleteMin(删除最小者)

简单的实现方式是使用二叉堆。

堆是一种非常实用的数据结构,其中以二叉堆最为常用。二叉堆可以看作一棵完全二叉树,每个节点的键值都大于(小于)其子节点,但左右孩子之间不需要有序。我们关心的通常只有堆顶的元素,而整个堆则被封装起来,保存在一个数组中。

下面分别介绍优先队列基本操作的实现

二、入队 (push)

基本实现步骤如下:

  • 在下一个空闲处建立一个空穴
  • 若空穴的父节点大于空穴的值,则将空穴向上行一步

流程图如下:

这里写图片描述

c 代码实现:

void Insert(int x, int *array, int num)
{
    int i;
    // i 表示空穴所在位置, i/2 表示空穴的父节点所在位置
    // array[0] = 0 作为哨兵防止溢出
    for (i = ++num; array[i/2] > x; i /= 2)
        array[i] = array[i/2];
    array[i] = x;
}

注意: 始终保持队列第一个元素为 0 是为了防止空穴上滤过程溢出

二、出队(pop)

需要考虑的是,由于堆现在少了一个元素,因此堆中最后一个元素 x 必须移动到该堆的某个地方。

基本实现步骤如下:

  • 根处建立一个空穴(默认将最后一个元素放入空穴)
  • 如果有比自己小的儿子,则将空穴的较小的儿子移入空穴
  • 否则将最后一个元素放入空穴

流程图如下:

这里写图片描述

c 代码实现:

void DeleteMin(int *array, int *size)
{   
    int num = *size;
    int lastVal = array[num--];
    int child;
    for (int i = 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值