算法基础 -- 堆排序之C语言实现
C语言实现堆排序(Heap Sort)
1. 代码实现
下面是 C语言实现的堆排序接口,支持 通用数据类型排序,并采用 函数指针 进行 自定义比较,适用于 整数排序 或 结构体排序。
完整代码
大根堆
#include <stdio.h>
#include <stdlib.h>
#include <string.h>/* 比较函数指针,返回值 >0 表示 a > b,=0 表示相等,<0 表示 a < b */
typedef int (*compare_func)(const void *, const void *);/* 交换函数 */
static void swap(void *a, void *b, size_t size) {void *temp = malloc(size);if (temp) {memcpy(temp, a, size);memcpy(a, b, size);memcpy(b, temp, size);free(temp);}
}/* 调整堆,保持最大堆性质 */
static void heapify(void *base, size_t nmemb, size_t size, size_t root, compare_func cmp) {size_t largest = root;size_t left = 2 * root + 1;size_t right = 2 * root + 2;char *arr = (char *)base;if (left < nmemb && cmp(arr + left * size, arr + largest * size) > 0) {largest = left;}if (right < nmemb && cmp(arr + right * size, arr + largest * size) > 0) {largest = right;}if (largest != root) {swap(arr + root * size, arr + largest * size, size);heapify(base, nmemb, size, largest, cmp);}
}/* 建立最大堆 */
static void build_heap(void *base, size_t nmemb, size_t size, compare_func cmp) {for (ssize_t i = (nmemb / 2) - 1; i >= 0; i--) {heapify(base, nmemb, size, i, cmp);}
}/* 堆排序 */
void heap_sort(void *base, size_t nmemb, size_t size, compare_func cmp) {if (!base || nmemb < 2 || !cmp) return;build_heap(base, nmemb, size, cmp);char *arr = (char *)base;for (size_t i = nmemb - 1; i > 0; i--) {swap(arr, arr + i * size, size);heapify(base, i, size, 0, cmp);}
}/* 整数比较函数 */
int int_compare(const void *a, const void *b) {return (*(int *)a - *(int *)b);
}/* 测试代码 */
int main() {int arr[] = {12, 11, 13, 5, 6, 7};size_t n = sizeof(arr) / sizeof(arr[0]);printf("原始数组: ");for (size_t i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");heap_sort(arr, n, sizeof(int), int_compare);printf("排序后数组: ");for (size_t i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}
小根堆
#include <stdio.h>
#include <stdlib.h>
#include <string.h>/* 比较函数指针,返回值 >0 表示 a > b,=0 表示相等,<0 表示 a < b */
typedef int (*compare_func)(const void *, const void *);/* 交换函数 */
static void swap(void *a, void *b, size_t size) {void *temp = malloc(size);if (temp) {memcpy(temp, a, size);memcpy(a, b, size);memcpy(b, temp, size);free(temp);}
}/* 调整堆,保持小根堆性质 */
static void min_heapify(void *base, size_t nmemb, size_t size, size_t root, compare_func cmp) {size_t smallest = root;size_t left = 2 * root + 1;size_t right = 2 * root + 2;char *arr = (char *)base;if (left < nmemb && cmp(arr + left * size, arr + smallest * size) < 0) {smallest = left;}if (right < nmemb && cmp(arr + right * size, arr + smallest * size) < 0) {smallest = right;}if (smallest != root) {swap(arr + root * size, arr + smallest * size, size);min_heapify(base, nmemb, size, smallest, cmp);}
}/* 建立小根堆 */
static void build_min_heap(void *base, size_t nmemb, size_t size, compare_func cmp) {for (ssize_t i = (nmemb / 2) - 1; i >= 0; i--) {min_heapify(base, nmemb, size, i, cmp);}
}/* 小根堆排序 */
void min_heap_sort(void *base, size_t nmemb, size_t size, compare_func cmp) {if (!base || nmemb < 2 || !cmp) return;build_min_heap(base, nmemb, size, cmp);char *arr = (char *)base;for (size_t i = nmemb - 1; i > 0; i--) {swap(arr, arr + i * size, size);min_heapify(base, i, size, 0, cmp);}
}/* 整数比较函数(小根堆适用) */
int int_compare_min(const void *a, const void *b) {return (*(int *)a - *(int *)b);
}/* 测试代码 */
int main() {int arr[] = {12, 11, 13, 5, 6, 7};size_t n = sizeof(arr) / sizeof(arr[0]);printf("原始数组: ");for (size_t i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");min_heap_sort(arr, n, sizeof(int), int_compare_min);printf("小根堆排序后数组: ");for (size_t i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}相关文章:
算法基础 -- 堆排序之C语言实现
C语言实现堆排序(Heap Sort) 1. 代码实现 下面是 C语言实现的堆排序接口,支持 通用数据类型排序,并采用 函数指针 进行 自定义比较,适用于 整数排序 或 结构体排序。 完整代码 大根堆 #include <stdio.h> #…...
Hutool - Extra:功能丰富的扩展模块
一、简介 Hutool - Extra 作为 Hutool 工具包的扩展模块,对众多第三方库和功能进行了封装,极大地丰富了 Hutool 的功能体系。它涵盖了模板引擎、邮件发送、Servlet 处理、二维码生成、Emoji 处理、FTP 操作以及分词等多个方面,为开发者在不同…...
C++ 中的继承详解(上)
目录 1、继承的概念及定义 1.1、继承的概念 1.2、继承定义 1.2.1、定义格式 1.2.2、继承方式 1.2.3、继承基类成员访问方式的变化 2、基类和派生类对象赋值转换 3、继承中的作用域 4、派生类的默认成员函数 补充:封装的层次(实际上有很多层的,这…...
halcon三维点云数据处理(二十五)moments_object_model_3d
目录 一、moments_object_model_3d例程二、moments_object_model_3d函数三、效果图 一、moments_object_model_3d例程 这个例子说明了如何使用moments_object_model_3d运算符来将3D数据与x、y、z坐标轴对齐。在实际应用中,通过3D传感器获取的物体模型可能具有一个与…...
Mac M3/M4 本地部署Deepseek并集成vscode
Mac 部署 使用傻瓜集成平台ollama,ollama平台依赖于docker,Mac的M3/M4 因doesn’t have VT-X/AMD-v enabled 所以VB,VM无法使用,导致docker无法启动,需要使用docker的替代品podman, 它完全兼容docker brew install p…...
2024年职高单招或高考计算机类投档线
问题: 这些学校2024年职高单招或高考计算机类投档线分别是多少 回答: 部分学校2024年职高单招或高考计算机类投档线如下: 湖南工业职业技术学院 职高单招:未查询到2024年职高单招计算机类专业明确的录取分数线信息。但在2024年…...
Unity Excel导表工具转Lua文件
思路介绍 借助EPPlus读取Excel文件中的配置数据,根据指定的不同类型的数据配置规则来解析成对应的代码文本,将解析出的字符串内容写入到XXX.lua.txt文件中即可 EPPlus常用API //命名空间 using OfficeOpenXml;//Excel文件路径 var fileExcel new File…...
SpringBoot项目集成MinIO
最近在学习MinIO,所以想让自己的SpringBoot项目集成MinIO,在网上查阅资料,并进行操作的过程中遇到一些问题,所以想把自己遇到的坑和完成步骤记录下来供自己和各位查阅。 一. MinIO的下载安装以及基本使用 1. 下载地址:https://d…...
第30篇 基于ARM A9处理器用C语言实现中断<六>
Q:怎样设计基于ARM A9处理器的C语言程序在数码管上滚动显示字符? A:使用A9 Private Timer中断源,控制字符滚动的速度;按键产生中断可以控制字符暂停/继续滚动。 本实验在DE1-SoC开发板的6个七段数码管*HEX5~HEX0*上…...
Flutter 中的单例模式
传统: class RouterManager {// 单例模式static final RouterManager _instance RouterManager._internal();factory RouterManager() {return _instance;}RouterManager._internal(); }传递参数进行初始化时: class RouterManager {// 私有静态实例&a…...
8.python文件
文章目录 1.**文件**1.1**文件是什么**1.2**文件路径**1.3**文件操作**1.3.1**打开文件**1.3.2**关闭文件**1.3.3**写文件**1.3.4**读文件** 1.4**关于中文的处理**1.5**使用上下文管理器** 大家好,我是晓星航。今天为大家带来的是 python文件 相关的讲解࿰…...
2025vue4.x全栈学习关键技术分析线路图
关键升级点说明: 编译优化 :Vue 4.x采用WASM编译提速300% 智能工具链 :Vite插件市场新增AI代码审查模块 跨平台能力 :Uni-App支持原生ARCore/ARKit调用 安全增强 :默认启用WebAuthn生物认证…...
革新之力:数字科技——重塑未来的超越想象之旅
在21世纪的科技浪潮中,数字科技如同一股不可阻挡的洪流,正以前所未有的速度和广度改变着我们的生活、工作乃至整个社会的结构。它不仅是技术的简单迭代,更是对人类社会认知边界的拓宽,对经济模式、社会治理、文化形态等多方面的深…...
超级详细,知识图谱系统的理论详解+部署过程
知识图谱系统(Knowledge Graph System)是一种用于表示、存储、查询和推理知识的系统。它通过结构化的方式将现实世界中的实体、概念及其相互关系组织成一个图结构,从而帮助机器理解和处理复杂的知识。 知识图谱的核心组成部分 实体(Entities): 实体是知识图谱中的节点,…...
电路笔记 (信号): opa tips 放大器反馈电阻并联电容抑制高频噪声的详细推导(传递函数分析)
1. 高频噪声传递函数分析 (1)电路结构 输入信号通过 R 1 R_1 R1 和 C NI C_{\text{NI}} CNI 的并联组合连接到运放的同相输入端。反馈电阻 R 2 R_2 R2 连接在运放的输出端和反相输入端之间。 Layer 1 - 30p R2 R1 R3R1//R2 IN OUT 反向放大电…...
DeepSeek安装部署笔记(一)
Ollamaopen-WebUI部署 DeepSeek安装部署笔记第一步 Ollama安装1.安装ollama:官网https://ollama.com/下载2.上面安装完成,在cmd命令行: 第二步 给DeepSeek添加OpenWebUI界面(重点)1.安装conda:用它来管理py…...
【JavaEE进阶】Spring MVC(4)-图书管理系统案例
欢迎关注个人主页:逸狼 创造不易,可以点点赞吗 如有错误,欢迎指出~ 图书管理系统 创建书籍类BookInfo import lombok.Data;import java.math.BigDecimal;Data //这个类基本上是和数据库对应起来的 public class BookInfo {private Integer id…...
Ubuntu部署ktransformers
准备工作 一台服务器 CPU:500G GPU:48G(NVIDIA4090) 系统:Ubuntu20.04(github的文档好像用的是22.04) 第一步:下载权重文件 1.下载hfd wget https://hf-mirror.com/hfd/hfd.s…...
助力DeepSeek私有化部署服务:让企业AI落地更简单、更安全
在数字化转型的浪潮中,越来越多的企业选择私有化部署AI技术,以保障数据安全、提升业务效率并实现自主可控。DeepSeek作为行业领先的AI开源技术,其技术可以支持企业私有化部署,企业需要一站式服务私有化部署,涵盖硬件采…...
面试官询问项目前后端人员配比之高分示范回答
面试官询问项目前后端人员配比之高分示范回答 以下是对两个项目前后端人员配置的精准分析,结合 技术复杂度、协作效率、风险控制 三个维度设计回答,突出合理性与团队协作意识: 一、《x能x服》项目(Vue重构) 1. 人员配置与分工 前端:1人(独立开发) 负责旧系统业务逻辑…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
Python爬虫实战:研究Restkit库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …...
2.2.2 ASPICE的需求分析
ASPICE的需求分析是汽车软件开发过程中至关重要的一环,它涉及到对需求进行详细分析、验证和确认,以确保软件产品能够满足客户和用户的需求。在ASPICE中,需求分析的关键步骤包括: 需求细化:将从需求收集阶段获得的高层需…...
MeshGPT 笔记
[2311.15475] MeshGPT: Generating Triangle Meshes with Decoder-Only Transformers https://library.scholarcy.com/try 真正意义上的AI生成三维模型MESHGPT来袭!_哔哩哔哩_bilibili GitHub - lucidrains/meshgpt-pytorch: Implementation of MeshGPT, SOTA Me…...
stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)
这是系统中断服务程序的默认处理汇编函数,如果我们没有定义实现某个中断函数,那么当stm32产生了该中断时,就会默认跑这里来了,所以我们打开了什么中断,一定要记得实现对应的系统中断函数,否则会进来一直循环…...
