当前位置: 首页 > news >正文

【C语言】“qsort函数详解”与“使用冒泡思想模拟使用qsort”

✨✨✨✨如果文章对你有帮助记得点赞收藏关注哦!!✨✨✨✨

文章目录

    • ✨✨✨✨如果文章对你有帮助记得点赞收藏关注哦!!✨✨✨✨
  • qsort的介绍:
  • 一、qsort函数的使用✨
        • 比较int类型数据
        • 比较字符型数据
        • 比较结构体数据
  • 冒泡思想模拟实现qsort函数
    • 完结

qsort的介绍:

  1. qsort ()函数是 C 库中实现的快速排序算法,包含在 stdlib.h 头文件中
  2. 此函数需要四个参数void qsort(void* *base, size_t nitems, size_t size, int (compar)(const void * , const void))
  • char* base —— 指向要排序的数组首元素地址的指针
  • size_t nitems —— 要排序数组的元素个数
  • size_t size —— 数组每个元素大的小 (有非常重要的作用)
  • int compar(const void *,const void *) —— 由使用者提供的一个比较两个元素的函数
    • 有两个参数,如果参数1大于参数2返回>0的数
    • 参数1等于参数2返回0
    • 参数1小于参数2返回<0的数
    • 使用void*当作参数类型是因为此函数是一个回调函数,我们并不知道使用函数的人要比较哪两种数据,所有把参数设置成void *让使用者可以比较任意一种数据。(详细见下面配上代码分解:使用冒牌排序思想模拟实现qsort)

3.此函数无返回值

一、qsort函数的使用✨

  • 比较int类型数据

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
int cmp_int(const void *arr1,const void *arr2)//提供按照int比较函数,如果参数1大于参数2返回>0的数,参数1等于参数2返回0,参数1小于参数2返回<0的数
{return *(int *)arr1 - *(int*)arr2;
}
int main()
{int arr[10] = { 4,3,5,6,7,8,1,2,9,0 };int sz = sizeof(arr) / sizeof(arr[0]);int width = sizeof(arr[0]);qsort(arr, sz, width, cmp_int);for (int i = 0; i < sz; i++){printf("%d ", arr[i]);   //0 1 2 3 4 5 6 7 8 9 }printf("\n");
}
  • 比较字符型数据

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int cmp_char(const void* str1,const void* str2)			//提供按照字符比较函数,如果参数1大于参数2返回>0的数,参数1等于参数2返回0,参数1小于参数2返回<0的数
{return *(char*)str1 - *(char*)str2;
}
int main()
{char str[10] = { 'g','c','b','d','f','e','a' };int len = strlen(str);int width2 =  sizeof(str[0]);qsort(str, len, width2, cmp_char);printf("%s", str);  			//abcdefgprintf("\n");
}
  • 比较结构体数据

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct a 
{char name[10];int age;
};int cmp_stru_a_name(const void * arr3,const void *arr4)		//按照name排序比较方法
{return strcmp(((struct a*)arr3)->name ,((struct a*)arr4)->name);
}int cmp_stru_a_age(const void* arr1, const void* arr2)		//按照age排序比较方法
{return ((struct a*)arr1)->age - ((struct a*)arr2)->age;
}
int main()
{struct a arr2[] = { {"baobao",2} ,{"aoligei",4}{"caomei",3}};int sz2 = sizeof(arr2)/sizeof(arr2[0]);int width3 = sizeof(arr2[0]);qsort(arr2, sz2, width3, cmp_stru_a_name);		//按照结构体中name排序for (int i = 0; i < sz2; i++){printf("%s ", arr2[i].name);    printf("%d ", arr2[i].age);}printf("\n");					//aoligei 4 baobao 2 caomei 3qsort(arr2, sz2, width3, cmp_stru_a_age);		//按照结构体中age排序for (int i = 0; i < sz2; i++){printf("%s ", arr2[i].name);printf("%d ", arr2[i].age);}								//baobao 2 caomei 3 aoligei 4
}

冒泡思想模拟实现qsort函数

qsort底层使用的是快速排序,我们使用冒泡排序思想模拟实现效果与qsort相同的函数

冒泡排序:每次把最大的一个数字交换到最后面


void swap(char* arr1, char* arr2,int width)
{for (int i = 0; i < width; i++){char* temp = *arr1;*arr1 = *arr2;*arr2 = temp;arr1++;arr2++;}
}
int cmp_int(const void* arr1, const void* arr2)		//提供比较函数
{return *(int*)arr1 - *(int*)arr2;		
}void  bubble_sort(void *base,size_t sz,size_t 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*)base+j*width,(char*)base+(j+1)*width)>0)	//由于设计bubble_sort函数的时候我们还不知道使用者想比较什么类型的数据,所有可以把base强制转换成字符型指针再乘上元素宽度进行比较,使得无论传入的是什么类型的数据都可以比较。{swap((char*)base+j*width,(char*)base+(j+1)*width,width);//使用swap交换的时候也是如此,我们设计bubble_sort函数的时候不知道要对多少个字节进行交换,所以用把base强转成char*和宽度一起传入swap中,一个字节一个字节的进行交换------## }}}
}
int main()
{int arr[10] = { 3,1,2,4,5,9,7,6,8,0 };int sz = sizeof(arr) / sizeof(arr[0]);int width = sizeof(arr[0]);bubble_sort(arr, sz, width, cmp_int);for (int i = 0; i < sz; i++){printf("%d ", arr[i]);		//打印结果:0 1 2 3 4 5 6 7 8 9}
}

由于设计bubble_sort函数的时候我们还不知道使用者想比较什么类型的数据,所有可以把base强制转换成字符型指针再乘上元素宽度进行比较,使得无论传入的是什么类型的数据都可以比较。

使用swap交换的时候也是如此,我们设计bubble_sort函数的时候不知道要对多少个字节进行交换,所以用把base强转成char*和宽度一起传入swap中,一个字节一个字节的进行交换
拿int类型举例
在这里插入图片描述


完结

创作不易,还请各位小伙伴多多点赞👍关注✨收藏⭐

请添加图片描述

相关文章:

【C语言】“qsort函数详解”与“使用冒泡思想模拟使用qsort”

✨✨✨✨如果文章对你有帮助记得点赞收藏关注哦&#xff01;&#xff01;✨✨✨✨ 文章目录✨✨✨✨如果文章对你有帮助记得点赞收藏关注哦&#xff01;&#xff01;✨✨✨✨qsort的介绍&#xff1a;一、qsort函数的使用✨比较int类型数据比较字符型数据比较结构体数据冒泡思想…...

接口自动化框架---升级版(Pytest+request+Allure)

目录&#xff1a;导读 一、简单介绍 二、目录介绍 三、代码分析 写在最后 接口自动化是指模拟程序接口层面的自动化&#xff0c;由于接口不易变更&#xff0c;维护成本更小&#xff0c;所以深受各大公司的喜爱。 第一版入口&#xff1a;接口自动化框架(PytestrequestAllure…...

C语言循环语句简述

C 循环 有的时候&#xff0c;我们可能需要多次执行同一块代码。一般情况下&#xff0c;语句是按顺序执行的&#xff1a;函数中的第一个语句先执行&#xff0c;接着是第二个语句&#xff0c;依此类推。 编程语言提供了更为复杂执行路径的多种控制结构。 循环语句允许我们多次…...

STM32开发(16)----CubeMX配置DMA

CubeMX配置DMA前言一、什么是DMA&#xff1f;二、实验过程1.CubeMX配置2.代码实现3.实验结果总结前言 本章介绍使用STM32CubeMX对DMA进行配置的方法&#xff0c;DMA的原理、概念和特点&#xff0c;配置各个步骤的功能&#xff0c;并通过串口DMA传输实验方式验证。 一、什么是…...

让物流园区可视可控,顺丰供应链与亚马逊云科技的供应链新解法

导读&#xff1a;物流园区如何破解供应链断点&#xff1f;在物流园区附近&#xff0c;我们经常看到周边道路停满了集装箱卡车。这是物流园区的一个典型痛点&#xff0c;由于园区内部业务情况的不可见性&#xff0c;司机们往往到了园区才被告知业务繁忙&#xff0c;需要长时间排…...

2023年3月北京/西安/广州/深圳DAMA-CDGA/CDGP数据治理认证报名

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…...

「TCG 规范解读」TCG 主规范-设计原则

可信计算组织(Ttrusted Computing Group,TCG)是一个非盈利的工业标准组织,它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立,并采纳了由可信计算平台联盟(the Trusted Computing Platform Alliance,TCPA)所开发的规范。现在的规范都不是最终稿,都…...

【Spring源码】Spring AOP的核心概念

废话版什么是AOP关于什么是AOP&#xff0c;这里还是要简单介绍下AOP&#xff0c;Aspect Oriented Programming&#xff0c;面向切面编程&#xff0c;通过预编译和运行期间提供动态代理的方式实现程序功能的统一维护&#xff0c;使用AOP可以降低各个部分的耦合度&#xff0c;提高…...

华为OD机试用Python实现 -【任务混部】(2023-Q1 新题)

华为OD机试题 华为OD机试300题大纲任务混部题目输入输出示例一输入输出说明示例二输入输出说明备注Code代码编写思路华为OD机试300题大纲 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:blog.csdn.net/hihell/ca…...

Linux yum 命令

yum&#xff08; Yellow dog Updater, Modified&#xff09;是一个在 Fedora 和 RedHat 以及 SUSE 中的 Shell 前端软件包管理器。 基于 RPM 包管理&#xff0c;能够从指定的服务器自动下载 RPM 包并且安装&#xff0c;可以自动处理依赖性关系&#xff0c;并且一次安装所有依赖…...

package.json 字段配置

文章目录环境导入相关main 和 modulewebpack resolve.mainFieldsbrowserexports定义其他模块根据导入语句导出嵌套环境导出vue中 exports 用法自定义运行环境环境导入相关 main 和 module 根据导入模块时不同的模块规范语句查找不同的入口文件 "main": "dist…...

springboot中集成redis,二次封装成工具类

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;** 雄雄的小课堂 ** 现在是&#xff1a;2023年2月28日11:01:56 前言 redis大家应该都不陌生&#xff0c;我们在好多场景下都会使用&#xff0c;最近在面试别人的时候&#xff0c;也会问一些关于redis的…...

Linux Vim 简介

文章目录01. 编辑器 Gedit 介绍02. 什么是 Vi(Vim)03. vim工作模式4.1 命令模式4.2 编辑模式4.3 末行模式04. vim教程05. vim基本操作06. vim实用操作7.1 命令模式下的操作7.2 末行模式下的操作01. 编辑器 Gedit 介绍 gedit 是一个 GNOME 桌面环境下兼容 UTF-8 的 文本编辑器。…...

软件测试面试题 —— 整理与解析(2)

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;&#x1f30e;【Austin_zhai】&#x1f30f; &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xf…...

HashMap与Hashtable的这九个区别,你知道吗

Hashtable Hashtable是原始的java.util的一部分&#xff0c;属于一代集合类&#xff0c;是一个Dictionary具体的实现 。Java1.2重构的Hashtable实现了Map接口&#xff0c;因此&#xff0c;Hashtable现在集成到了集合框架中。它和HashMap类很相似。 Hashtable与HashMap的区别 …...

Java奠基】掌握Java基础知识

目录 常见字面量 特殊字面量 数据类型 标识符 键盘录入 常见字面量 字面量就是数据在程序中的书写格式&#xff0c;字面量的分类如下&#xff1a; 字面量类型说明举例整数类型不带小数点的数字12&#xff0c;25小数类型带小数点的数字3.14&#xff0c;-5&#xff0c;20…...

Hive窗口函数-lead/lag函数

前面我们学习的first_value和last_value 取的是排序后的数据截止当前行的第一行数据和最后一行数据 Lag和Lead分析函数可以在一次查询中取出当前行后N行和前N行的数据&#xff0c;虽然可以不用排序&#xff0c;但是往往只有在排序的场景下取前面或者后面N 行数据才有意义 这种…...

2023JAVA面试题全集超全面超系统超实用!早做准备早上岸

2022年我凭借一份《Java面试核心知识点》成功拿下了阿里、字节、小米等大厂的offer&#xff0c;两年的时间&#xff0c;为了完成我给自己立的flag&#xff08;拿下一线互联网企业offer大满贯&#xff09;&#xff0c;即使在职也一直在不断的学习与备战面试中&#xff01;——或…...

FreeRTOS入门(05):事件组

文章目录目的基础说明相关函数使用演示总结目的 事件组是RTOS中相对常用的用于任务间交互的功能&#xff0c;这篇文章将对相关内容做个介绍。 本文代码测试环境见前面的文章&#xff1a;《FreeRTOS入门&#xff08;01&#xff09;&#xff1a;基础说明与使用演示》 基础说明…...

【API网关】Kong安装和基本操作

文章目录前言一、API网关选型和Kong的安装1. 什么是API网关2. API网关技术选型3. 安装postgresql和migrations4. 安装kong5. 安装konga二、基本的路由转发配置1. kong的8001、8000和1337端口号的关系2. 基本的路由转发配置3. kong集成consul实现服务发现和负载均衡4. kong配置j…...

抖音内容高效获取技术方案:基于douyin-downloader的分布式下载架构实践

抖音内容高效获取技术方案&#xff1a;基于douyin-downloader的分布式下载架构实践 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browse…...

SITS 2026正式落地:如何用1套AI原生系统将技术文档交付周期从14天压缩至2.3小时?

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI原生文档生成系统&#xff1a;SITS 2026技术文档自动化方案 SITS 2026&#xff08;Semantic Intelligence Technical Specification System&#xff09;是面向云原生与多模态代码仓库深度集成的AI原生…...

人工智能逻辑复兴与全球教育变革战略提案

人工智能逻辑复兴与全球教育变革战略提案摘要&#xff1a; 本提案基于贾子哲学&#xff0c;提出《人工智能逻辑复兴支持计划》&#xff0c;终结暴力计算与数据殖民&#xff0c;以“真理硬度”“语义主权”为核心&#xff0c;推动算力霸权降级与公理化革命。分析产业界将经历“物…...

开源技能集市:构建去中心化社区互助平台的技术实践

1. 项目概述&#xff1a;一个开源的技能集市构想最近在琢磨一个挺有意思的想法&#xff0c;就是做一个开源的技能集市。这个念头源于一个很实际的观察&#xff1a;我们身边其实藏着很多“扫地僧”式的人物&#xff0c;他们可能不是某个领域的专家&#xff0c;但总有一些独特的技…...

手把手教你:误删pyvenv.cfg后,如何快速重建Python虚拟环境(附详细步骤)

手把手教你&#xff1a;误删pyvenv.cfg后&#xff0c;如何快速重建Python虚拟环境&#xff08;附详细步骤&#xff09; 虚拟环境是Python开发中的"隔离舱"&#xff0c;而pyvenv.cfg文件则是这个隔离舱的"控制面板"。当你发现误删这个关键文件后&#xff0c…...

STM32新手避坑指南:正点原子、野火、慧净、小马飞控的Systick延时函数到底差在哪?

STM32开发板Systick延时函数深度对比&#xff1a;从原理到避坑实战 第一次接触STM32开发时&#xff0c;我对着四块不同品牌的开发板愣了半天——正点原子、野火、慧净、小马飞控&#xff0c;每家的例程里Systick延时函数实现都不一样。有的用72MHz时钟&#xff0c;有的用9MHz&a…...

别再手动描边了!用Altium Designer的DXF导入功能,5分钟搞定CAD机械结构图转PCB外框

高效机电协同&#xff1a;Altium Designer DXF导入功能在PCB设计中的实战应用 在硬件产品开发流程中&#xff0c;机械结构与电子设计的无缝对接一直是影响项目进度的关键节点。传统的手动描边方法不仅耗时费力&#xff0c;还容易引入人为误差——据统计&#xff0c;约37%的板框…...

树莓派新手避坑指南:从烧录系统到VNC远程桌面的10个常见错误

树莓派新手避坑指南&#xff1a;从烧录系统到远程桌面的10个致命陷阱 第一次接触树莓派时&#xff0c;那种既兴奋又忐忑的心情我至今记忆犹新。看着这块信用卡大小的板子&#xff0c;很难想象它能完成那么多酷炫的项目。但现实往往很骨感——当我按照网上教程一步步操作时&…...

从SQL到领域语言:我是如何用Antlr4在IDEA里“造”了一个简易查询引擎的

从SQL到领域语言&#xff1a;用Antlr4构建定制化查询引擎的实战之旅 当业务逻辑复杂到SQL语句难以直观表达时&#xff0c;或许该考虑为你的领域设计一门专属查询语言了。去年在重构电商订单系统时&#xff0c;我面对诸如"找出最近30天退货率高于15%的商家&#xff0c;且这…...

FPGA测控接收机频域空时自适应抗干扰滤波方法【附程序】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导&#xff0c;毕业论文、期刊论文经验交流。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;可以私信&#xff0c;或者点击《获取方式》 &#xff08;1&#xff09;N-σ门限与自适应μ值频域…...