模拟实现qsort函数:冒泡排序详解

简介: 模拟实现qsort函数:冒泡排序详解

前言:


在C语言中,标准库提供了qsort函数用于对数组进行排序。qsort函数是一个通用的排序函数,可以根据用户提供的比较函数对数组进行排序。在本篇博客中,我们将介绍如何用冒泡排序模拟实现qsort函数的功能。首先,我们会详细介绍冒泡排序的原理和实现方式,然后演示如何用冒泡排序来模拟实现qsort函数

一、冒泡排序的原理

冒泡排序是一种简单直观的排序算法,其基本思想是通过相邻元素的比较和交换来实现排序。具体步骤如下:

  1. 从数组的第一个元素开始,依次比较相邻的两个元素,如果顺序不对则交换它们的位置,直到将最大的元素交换到数组末尾。
  2. 重复上述步骤,每次比较和交换都会将剩余元素中的最大值移动到正确的位置。
  3. 经过n-1次遍历后,数组就会按照从小到大的顺序排列。

冒泡排序的时间复杂度为O(n^2),在大多数情况下并不是最优的排序算法,后面我们在学习了其他的排序后并不会经常用到它,但它的过程非常清晰,很适合初学者


二、模拟实现qsort函数

现在让我们开始模拟实现qsort函数,使用冒泡排序来对数组进行排序。首先,我们需要定义一个比较函数,用于指定排序的规则。比较函数的定义如下:

int compare(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}

比较函数的作用是比较两个元素的大小关系,如果a小于b,则返回负值;如果a等于b,则返回0;如果a大于b,则返回正值。

接下来,我们实现冒泡排序函数bubbleSort,其参数包括待排序数组、数组元素个数、元素大小和比较函数。具体代码如下:

void Swap(char* e1, char* e2, int width)
{
    while (width--)
    {
        char tmp = *e1;
        *e1 = *e2;
        *e2 = tmp;
        e1++;
        e2++;
    }
}
void Bubble(void* a, int sz, int width,
    int(*cmp)(const void* , const void* ))
{
    for (int i = 0; i < sz-1; i++)
    {
        for (int j = 0; j < sz - i -1; j++)
        {
            if (cmp((char*)a + j * width, (char*)a + (j + 1) * width) > 0)
            {
                //满足条件就进行交换
                Swap((char*)a + j * width, (char*)a + (j + 1) * width, width);
            }
        }
    }
}

在bubbleSort函数中,我们使用冒泡排序算法对数组进行排序,通过比较函数指定排序规则,实现了模拟qsort函数的功能。

最后,在main函数中,我们可以测试我们模拟实现的qsort函数。具体代码如下:

int main()
{
    int a[] = { 2,5,3,7,8,4,9,1,0,6 };
    int sz = sizeof(a) / sizeof(a[0]);
    printf("排序前:");
    for (int i = 0; i < sz; i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");
    Bubble(a, sz, sizeof(int), cmp);
    printf("排序后:");
    for (int i = 0; i < sz; i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");
    return 0;
}

在main函数中,我们定义了一个整数数组a,并调用bubbleSort函数对数组进行排序。最后,输出原始数组和排序后的数组,以验证排序的正确性。

三、完整代码示例

#include<stdio.h>
int cmp(const void* e1, const void* e2)
{
    return *(int*)e1 - *(int*)e2;
}
void Swap(char* e1, char* e2, int width)
{
    while (width--)
    {
        char tmp = *e1;
        *e1 = *e2;
        *e2 = tmp;
        e1++;
        e2++;
    }
}
void Bubble(void* a, int sz, int width,
    int(*cmp)(const void* , const void* ))
{
    for (int i = 0; i < sz-1; i++)
    {
        for (int j = 0; j < sz - i -1; j++)
        {
            if (cmp((char*)a + j * width, (char*)a + (j + 1) * width) > 0)
            {
                //满足条件就进行交换
                Swap((char*)a + j * width, (char*)a + (j + 1) * width, width);
            }
        }
    }
}
int main()
{
    int a[] = { 2,5,3,7,8,4,9,1,0,6 };
    int sz = sizeof(a) / sizeof(a[0]);
    printf("排序前:");
    for (int i = 0; i < sz; i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");
    Bubble(a, sz, sizeof(int), cmp);
    printf("排序后:");
    for (int i = 0; i < sz; i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");
    return 0;
}

运行结果:

通过以上详细介绍和演示,我们成功模拟实现了qsort函数的功能,使用冒泡排序算法对数组进行排序。冒泡排序虽然效率不高,但通过这个实例,我们可以更深入地理解排序算法的基本原理和实现方式。希望本文对您有所帮助,谢谢阅读!

创作不易,还请点个小小的赞!

相关文章
|
存储 关系型数据库 MySQL
MySQL 处理大数据表的 3 种方案,写的太好了,建议收藏!!
MySQL 处理大数据表的 3 种方案,写的太好了,建议收藏!!
1546 0
|
6月前
|
人工智能 弹性计算 安全
OpenClaw有什么用?本地/阿里云部署+百炼集成+个股分析实战盈利及避坑指南
你是否早已厌倦AI仅能“纸上谈兵”——写方案、改文字却无法落地执行?真正的AI生产力,应该是你设定目标,它全程闭环完成。OpenClaw(Clawdbot)作为首个开源本地部署的AI Agent平台,彻底打破了这一局限:它不是聊天机器人,而是能自动抓取新闻、分拣邮件、监控代码、甚至搭建个股分析模型的“数字员工”,连接飞书、微信等20+平台,数据全程本地化,完全开源可定制。
1274 160
|
数据采集 JSON API
深入解析:使用 Python 爬虫获取淘宝店铺所有商品接口
本文介绍如何使用Python结合淘宝开放平台API获取指定店铺所有商品数据。首先需注册淘宝开放平台账号、创建应用并获取API密钥,申请接口权限。接着,通过构建请求、生成签名、调用接口(如`taobao.items.search`和`taobao.item.get`)及处理响应,实现数据抓取。代码示例展示了分页处理和错误处理方法,并强调了调用频率限制、数据安全等注意事项。此技能对开发者和数据分析师极具价值。
|
8月前
|
自然语言处理 监控 数据挖掘
2026 年数据分析Agent与ChatBI产品推荐指南:数据智能驱动业务新增长
2026年,数据分析迈向“主动洞察”时代。瓴羊Quick BI凭借“智能小Q”实现自然语言交互、自动归因分析与报告生成,支持秒级响应、多端协同及行业定制化落地,助力企业高效决策,成为数据驱动转型的标杆选择。
|
8月前
|
缓存 JavaScript 前端开发
Vue的生命周期详解及业务场景应用
本文详细介绍Vue.js的生命周期概念及各阶段钩子函数的作用,结合实际业务场景讲解如何合理使用created、mounted、updated等钩子进行数据初始化、DOM操作、资源清理等,帮助开发者提升组件管理能力与代码性能。
327 0
Vue的生命周期详解及业务场景应用
|
人工智能 自然语言处理 数据可视化
LLaMA Factory 微调实践:从零构建苏东坡角色扮演大模型
简介:本文介绍如何使用LLaMA-Factory框架微调苏东坡角色扮演大模型,涵盖数据准备、训练与评估全流程。通过Lab4AI平台可一键复现,快速构建具东坡文风的AI对话体,赋能文化、教育等场景。
651 0
|
自然语言处理 Kubernetes 异构计算
推理降本与提升资源效率的实践
本课程从业务角度探讨大模型推理部署及资源利用率提升。首先分析大模型与GPU发展趋势,包括模型开源、规模增长及多模态能力增强;其次介绍高效部署大模型推理业务的步骤,涵盖业务场景选择、架构优化及显存规划;接着讲解如何通过DeepCPU-LLM框架和DeepNCCL通讯库优化推理效率;最后探讨通过KuberGPU实现细粒度GPU资源管理,提升整体资源利用率,降低推理成本。
|
存储 设计模式 IDE
从基础到高级的 Java 学习资料全面汇总
本文汇总了Java学习的全面资料,涵盖Java基础、面向对象编程、核心知识、高级特性及常用框架,如Spring和Hibernate。内容包括技术详解、代码实例及学习资源推荐,助力从入门到精通Java编程,适合各阶段学习者参考。
875 0
|
人工智能 缓存 Java
用 AI 搭建秒杀平台后端,一周搞定所有功能(附超详细踩坑记录)
本文分享如何借助AI技术快速搭建电商秒杀平台后端。通过飞算JavaAI,从需求分析到代码生成全流程智能化,大幅提高开发效率。文章详细记录了技术栈选择(Java、Spring Boot、MySQL、Redis)、系统架构设计、缓存机制优化、数据一致性保障及测试调优等环节,解决高并发难题,助开发者高效完成秒杀平台构建并规避常见坑点。
|
供应链 监控 API
智能供应链中的电商API:实现库存、订单与物流的自动化管理
本文探讨了智能供应链中电商API的关键作用,涵盖库存、订单与物流的自动化管理。通过实时库存同步、预警补货、多仓库整合,优化库存效率;借助订单自动处理、状态跟踪及修改取消功能,提升订单管理精度;结合物流信息查询、智能路线规划与异常处理,增强物流服务可靠性。以Temu为例,展示其在跨境场景下应用API实现高效供应链管理的实践。未来,随着技术进步,电商API将持续推动供应链向智能化、协同化发展。

热门文章

最新文章