[数据结构]:15-堆排序(顺序表指针实现形式)(C语言实现)

news2025/1/21 8:52:11

目录

前言

已完成内容

堆排序实现

01-开发环境

02-文件布局

03-代码

01-主函数

02-头文件

03-PSeqListFunction.cpp

04-SortCommon.cpp

05-SortFunction.cpp

结语


前言

        此专栏包含408考研数据结构全部内容,除其中使用到C++引用外,全为C语言代码。使用C++引用主要是为了简化指针的使用,避免二重指针的出现。

已完成内容

[数据结构]:01-顺序表(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:02-单链表(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:03-栈(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:04-循环队列(数组)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:05-循环队列(链表)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:06-队列(链表带头结点)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:07-二叉树(无头结点)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:08-顺序查找(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:09-二分查找(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:10-二叉排序树(无头结点)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:11-冒泡排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

 [数据结构]:12-快速排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:13-插入排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:14-选择排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客 

堆排序实现

01-开发环境

        语言:C/C++14

        编译器:MinGW64

        集成开发环境:CLion2022.1.3

02-文件布局

        请在CLion集成开发环境中创建C++可执行程序,否则无法运行,原因上面已解释。

                        ​​​     

03-代码

01-主函数

        用于测试堆排序。

// 顺序表以指针形式实现(申请堆空间,可动态控制顺序表大小)--数组实现形式不可以动态控制顺序表大小
#include "./Head/PSeqSearchData.h"
#include "./Source/PSeqListFunction.cpp"
#include "./Source/SortCommon.cpp"
#include "./Source/SortFunction.cpp"

int main() {
    // 顺序表初始化
    PSeqList PSL;
    PSeqListCreate(PSL, 10);
    PSeqListPrint(PSL);

    // 调试内容
//    int Array[] = {2, 3, 1, 5, 1, 10};
    memcpy(PSL.data, Array, sizeof(Array));
//    PSL.data = Array;
//    PSL.ListLength = 6;

    // 堆排序
    HeapSort(PSL.data, PSL.ListLength);
    PSeqListPrint(PSL);
    return 0;
}

02-头文件

        用于存储结构体和常量等。

//
// Created by 24955 on 2023-03-02.
// 顺序表以指针形式实现(申请堆空间,可动态控制顺序表大小)-数组实现形式不可以动态控制顺序表大小
//

#ifndef INC_01_SEQUENCESEARCH_PSEQSEARCHDATA_H
#define INC_01_SEQUENCESEARCH_PSEQSEARCHDATA_H
// 头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

// 常量
typedef int ElemType;

// 结构体
// 顺序表结构体(以指针形式实现)
typedef struct {
    ElemType *data;
    int ListLength;
}PSeqList;
#endif //INC_01_SEQUENCESEARCH_PSEQSEARCHDATA_H

03-PSeqListFunction.cpp

        用于存储顺序表初始化和打印输出等函数。

//
// Created by 24955 on 2023-03-02.
// 顺序表以指针形式实现(申请堆空间,可动态控制顺序表大小)--数组实现形式不可以动态控制顺序表大小
// 不使用哨兵
//
// 顺序表初始化
void PSeqListCreate(PSeqList &PSList, int Length) {
    /*
     * 1. 为顺序表申请堆空间
     * 2. 根据Length大小设置顺序表长度
     * 3. 随机数初始化顺序表*/
    PSList.ListLength = Length;
    PSList.data = (ElemType *) malloc((PSList.ListLength) * sizeof(ElemType));
    srand(time(NULL));
    for (int i = 0; i < PSList.ListLength; i++) {
        PSList.data[i] = rand() % 100;
    }
}

// 顺序表打印输出
void PSeqListPrint(PSeqList PSList) {
    /*
     * 1. 0号元素为哨兵因此从1号元素开始打印输出*/
    for (int i = 0; i < PSList.ListLength; i++) {
        printf("%3d", PSList.data[i]);
    }
    printf("\n");
}

04-SortCommon.cpp

        用于存储排序公用函数。

//
// Created by 24955 on 2023-03-06.
//
// 交换两值元素
void Swap(ElemType &ElemOne, ElemType &ElemTwo) {
    /*
     * 1. 交换两元素值*/
    ElemType TemporaryData;
    TemporaryData = ElemOne;
    ElemOne = ElemTwo;
    ElemTwo = TemporaryData;
}

05-SortFunction.cpp

        用于存储堆排序函数。

//
// Created by 24955 on 2023-03-06.
// 堆排序时间复杂度O(n*log2n),空间复杂度O(1)
//
// 将一颗树调整为最大堆(大根堆)
void AdjustToMaxHeap(ElemType *Data, int ChildPos, int Length) {
    /*
     * 1. 计算父亲、左孩子结点下标
     * 2. 判断孩子结点是否大于数组长度,不大于进入循环
     * 3. 判断是否包含右孩子,并记录较大孩子的下标
     * 4. 比较较大孩子与父亲数值大小
     * 5. 若孩子较大,发生交换,并将当前孩子结点当做父节点,判断其子树是否满足最大堆条件
     * 6. 若父亲较大,则表明后续子树已满足最大堆条件,可结束循环*/
    // 记录父亲结点下标,计算左孩子结点下标
    int ParentPos = ChildPos;
    int SonPos = ParentPos * 2 + 1;
    // 循环判断子树是否满足最大堆条件
    while (SonPos < Length) {
        // 判断是否包含右孩子
        if (SonPos + 1 <= Length - 1) {
            // 比较左、右孩子大小,并记录较大孩子的下标
            if (Data[SonPos + 1] > Data[SonPos]) {
                SonPos++;
            }
        }
        // 比较较大孩子与父亲数值大小
        if (Data[SonPos] > Data[ParentPos]) {
            // 若孩子较大,发生交换
            Swap(Data[SonPos], Data[ParentPos]);
            // 并将当前孩子结点当做父节点,判断其子树是否满足最大堆条件
            ParentPos = SonPos;
            SonPos = ParentPos * 2 + 1;
        } else {
            // 若父亲较大,则表明后续子树已满足最大堆条件,可结束循环
            break;
        }
    }
}

// 堆排序
void HeapSort(ElemType *Data, int Length) {
    /*
     * 1. 先将树调整成一个最大堆
     * 2. 交换0号元素(最大值)与最后一个元素交换
     * 3. 剔除已完成的最后一个元素后调整根树
     * 4. 使其为最大堆,交换0号元素与当前最后一个元素(已排序好的剔除)
     * 5. 循环n-1次即排序完成*/
    // i = Length / 2 - 1;最后一个子树所在位置
    // 对每一颗子树进行操作
    for (int i = Length / 2 - 1; i >= 0; i--) {
        // 生成最大堆
        AdjustToMaxHeap(Data, i, Length);
    }
    // 将0号元素(最大值)与最后一个元素交换
    Swap(Data[0], Data[Length - 1]);

    // 后续均为调整0号根树,数组长度每次-1
    for (int len = Length - 1; len > 0; len--) {
        AdjustToMaxHeap(Data, 0, len);
        Swap(Data[0], Data[len - 1]);
    }
}

结语

        此博客主要用于408考研数据结构C语言实现记录,内有不足,可留言,可讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/397548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

android h5考勤管理系统myeclipse开发mysql数据库编程服务端java计算机程序设计

一、源码特点 android h5考勤管理系统是一套完善的WEBandroid设计系统&#xff0c;对理解JSP java&#xff0c;安卓app编程开发语言有帮助&#xff08;系统采用web服务端APP端 综合模式进行设计开发&#xff09;&#xff0c;系统具有完整的源代 码和数据库&#xff0c;系统主…

平板触控笔要原装的吗?开学季必备电容笔推荐

如今对那些把ipad当做学习工具的用户而言&#xff0c;Apple Pencil就显得尤为重要了。但由于Apple Pencil的售价实在太高&#xff0c;让学生党望而却步。因此&#xff0c;最好的办法就是选择平替电容笔。我是一个ipad设备的忠实用户&#xff0c;同时也是一个数码热衷者&#xf…

MySQL增量备份和全量备份

1 全量备份 1.1 创建用于备份的目录 mkdir /root/mysql.backup1.2 创建存入备份文件的目录 mkdir /root/mysql.backup/data1.3 进入备份目录&#xff0c;创建备份脚本 cd /root/mysql.backupvim mysqlBackuoShell.sh#!/bin/bash #保存备份个数,31条 number31 #备份保存路…

Infineon Aurix 系列网络安全概述

目录 硬件安全 其它 1999年&#xff0c;英飞凌推出了第一代AUDO(汽车统一处理器)系列。基于统一的以RISC/MCU/DSP处理器为核心&#xff0c;这款32位TriCore™微控制器是一款强大的计算机器。其不断改进和优化TriCore的概念&#xff0c;最终形成了现在的第六代TriCore™,由于其…

ACWING蓝桥杯每日一题python(持续更新

ACWing蓝桥杯每日一题 一直没时间去总结算法&#xff0c;终于有空可以总结一下刷的acwing了&#xff0c;因为没时间所以最近只刷了ACWING的蓝桥杯每日一题。。。真是该死 1.截断数组 首先我们要知道&#xff0c;如果sum(a)不能被3整除或者len(a) < 3 &#xff0c;那么他肯…

Android使用移动智能终端补充设备标识获取OAID

官网http://www.msa-alliance.cn/col.jsp?id120首先到官网注册账号&#xff0c;申请下载相关sdk和授权证书2.把 oaid_sdk_x.x.x.aar 拷贝到项目的 libs 目录&#xff0c;并设置依赖&#xff0c;其中x.x.x 代表版本号3.supplierconfig.json 拷贝到项目 assets 目录下&#xff0…

keepalived实现nginx高可用

文章目录前言keepalived简介软件架构简单理解环境准备一、keepalived安装1.1 下载keepalived 安装包1.2 解压/下载依赖1.3 编译1.4 创建软连接1.5 增加系统服务1.6 启动keepalived二、实现Nginx高可用2.1 创建keepalived配置文件2.2 Nginx监控脚本2.4 重启keepalived2.5 查看虚…

自己DIY装机后,如何使用U盘装系统

最近自己整了一台主机&#xff0c;然后需要装一下系统&#xff0c;这边就讲一下如何用U盘给新电脑装系统。 安装Windows 10 光盘映像 首先你需要一个内存大于8GB的U盘&#xff0c;并且是纯净的&#xff0c;里面没有东西。 这边以Windows 10 为例&#xff1a; 百度搜索 下载…

IMX6ULL 启动方式之启动设备的选择

一. 硬件启动方式选择 汇编程序启动 LED 灯实验&#xff0c;是从SD卡读取 bin 文件并启动&#xff0c;说明 IMX6ULL 支持从 SD 卡启动。 IMX6ULL 支持多种启动方式。 注意&#xff1a;硬件原理图中&#xff0c;标注 DNP ( do not pupulate) 的意思是不焊接&#xff0c;即没…

【AcWing】归并排序及其应用

&#x1f386;音乐分享 &#xff08;点击链接可以听哦&#x1f60e;&#xff09; 无名之辈 - 陈雪燃 目录 归并排序 归并排序应用 文章中的图片来源&#xff1a; (2条消息) 归并排序&#xff08;分治法&#xff09;_分治法 归并排序_小小的香辛料的博客-CSDN博客 AcWing…

Springboot怎么实现WebSocket通信(二)

前言上一篇文章分享了单机模式下&#xff0c;websocket的基本使用方法&#xff0c;但在实际的业务中&#xff0c;通常是不会这样使用的&#xff0c;大部项目都是分布式部署的&#xff0c;一个工程布署了多个服务节点&#xff0c;前端并不直接请求具体服务节点&#xff0c;而是先…

C51---PWM 脉冲宽度调制

1.PWM:脉冲宽度调制,它是通过一系列脉冲宽度进行调制&#xff0c;等效出所需要的波形&#xff08;包含形状以及幅值&#xff09;。对模拟信号电平进行数字编码。也就是说通过调节占空比的变化来调节信号、能量等的变化&#xff0c;占空比就是指在一个周期内&#xff0c;信号处于…

第九届省赛——6打印大X

题目&#xff1a;本题目要求你在控制台输出一个由数字组成的等腰三角形。具体的步骤是&#xff1a;1. 先用1,2,3&#xff0c;...的自然数拼一个足够长的串2. 用这个串填充三角形的三条边。从上方顶点开始&#xff0c;逆时针填充。比如&#xff0c;当三角形高度是8时&#xff1a…

【Java开发】JUC进阶 06:异步回调、JMM、Volatile

1 异步回调异步是多线程的一种特殊实现方式&#x1f4cc; 举例我需要一个计算时间5秒方法的返回值我不想等这5秒钟&#xff0c;我想要继续执行下面的代码&#xff0c;那就异步执行这个方法当我通过get去获取这个返回值时&#xff0c;如果已经过了5秒&#xff0c;也就是方法执行…

16、参数估计

概率基本定义先验分布&#xff1a;似然函数&#xff1a;后验分布&#xff1a;贝叶斯公式&#xff1a;&#xff0c;其中后验分布 似然函数 先验分布 / P(D)贝叶斯公式假设&#xff0c;现在有两个一定概率发生的事件A和B&#xff0c;且它们之间存在一定的关系P(A) 表示事件A发生…

UNIX网络编程卷一 学习笔记 第八章 基本UDP套接字编程

UDP是无连接不可靠的数据报协议&#xff0c;不同于TCP提供的面向连接的可靠字节流。使用UDP编写的常见程序有&#xff1a;DNS、NFS、SNMP。 以下是典型的UDP客户/服务器程序的函数调用&#xff0c;客户不与服务器建立连接&#xff0c;而是只使用sendto函数给服务器发送数据报&…

03_Linux压缩解压,用户用户组,文件权限

目录 Linux下常用的压缩格式 gzip 压缩工具 gzip 对文件夹进行压缩 bzip2 压缩工具 tar打包工具 对.tar.bz2 进行压缩和解压缩 对.tar.gz 进行压缩和解压缩 rar格式 zip格式 Linux用户 Linux用户组 创建用户和用户组 Linux文件权限 Linux文件权限修改 Linux下常用…

windows10安装nodejs

一、下载 官网 Download | Node.js 某云盘 链接&#xff1a;https://pan.baidu.com/s/1PCd4fh4ohEvAc8qSrb4-WA 提取码&#xff1a;yola 二、安裝 双击安装程序&#xff1a;具体步骤如下&#xff1a; 设置环境变量 验证安装是否安装成功 进入cmd命令行窗口&#xff0c;输入…

SQL优化操作1

一.存储过程建表 建两张30万条数据的表以做测试用 1.user_course_info delimiter $$ # 定义结束符 drop procedure if exists addTestDataOne; # 存储过程名叫&#xff1a;addTestData create procedure addTestDataOne() begin declare number int; set number 1; w…

node 配置 vue npm配置

下载node 版本16https://nodejs.org/download/release/v16.16.0/node-v16.16.0-x64.msi复制安装地址&#xff0c;省空间&#xff0c;生报错老老实实复制就好D:\Program\nodejs新建node_cache和node_globalD:\Program\nodejs\node_cacheD:\Program\nodejs\node_global运行命令np…