【C语言】qsort()函数排序及其模拟实现,万物皆可排!

🔥博客主页🔥:【 坊钰_CSDN博客 】

欢迎各位点赞👍评论✍收藏⭐

目录

 1. 函数介绍

 2. qsort举例排列整型变量

3. qsort举例排列结构型变量

3.1 按名字排序

3.1.1  srtcmp函数

3.2 按年龄排序

4. qsort函数模拟实现(采用冒泡的方式)

5. 小结


 1. 函数介绍

void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*));

可以看到qsort函数有四种参数,我们来一一解释:

1. void* base

指向要排序的数组的第一个对象的指针,转换为 void*,通俗来讲就是数组首元素地址;

2. size_t num

数组中指向的元素个数;

3. size_t size

数组中每个元素的大小(以字节为单位);

4. int (*compar)(const void*,const void*)

指向比较两个元素的函数的指针。
此函数通过比较两个元素反复调用。它应遵循以下原型:

将两个指针作为参数(都转换为 const void*)。该函数通过返回(以稳定和传递的方式)定义元素的顺序:

注意:qsort函数无返回值;

 2. qsort举例排列整型变量

#include <stdio.h>int cmp_imp(const void* p1, const void* p2)
{return *(int*)p1 - *(int*)p2;
}int main()
{int arr[] = { 2,3,4,1,5,7,6,8,9,10 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp_imp);for (int i = 0; i < sz; i++){printf("%d ", *(arr + i));}return 0;
}

3. qsort举例排列结构型变量

这是一个结构体

struct Student
{char name[100];int age;
};

3.1 按名字排序

这个用到了strcmp函数

3.1.1  srtcmp函数

int strcmp ( const char * str1, const char * str2 )

 返回值

 代码:

#include <stdio.h>struct Student
{char name[100];int age;
};void cmp_srt_imp(const void* p1, const void* p2)
{return strcmp(((struct Student*)p1)->name , ((struct Student*)p2)->name);
}int main()
{struct Student arr[3] = { {"zhangsan",18},{"lisi",20},{"wangwu",19}};int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp_srt_imp);for (int i = 0; i < sz; i++){printf("%s %d ", arr[i]);}return 0;
}

3.2 按年龄排序

struct Student
{char name[100];int age;
};void cmp_srt_imp(const void* p1, const void* p2)
{return ((struct Student*)p1)->age - ((struct Student*)p2)->age;
}int main()
{struct Student arr[3] = { {"zhangsan",18},{"lisi",20},{"wangwu",19} };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp_srt_imp);for (int i = 0; i < sz; i++){printf("%s %d ", arr[i]);}return 0;
}

4. qsort函数模拟实现(采用冒泡的方式)

用这样的方式qsort函数可排列任意的数据类型

代码:

#include <stdio.h>//仿qsort函数重写冒泡排序int cmp(const void* p1, const void* p2)     //所选择的比较方法
{return (*(int*)p1 - *(int*)p2);
}void cmp_swap(char* p1, char* p2,int width)     //实现数组元素的交换
{for (int i = 0; i < width; i++){int ret = *p1;*p1 = *p2;*p2 = ret;p1++;p2++;}
}void bubble(void* base, int sz, int width, int (*cmp)(const void* p1, const void* p2))
{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){//符合条件进行交换cmp_swap(((char*)base+j*width), ((char*)base + (j+1) * width),width);}}}
}int main()
{int arr[] = { 2,1,3,5,6,4,7,9,8,10 };       //定义整型数组并初始化int sz = sizeof(arr) / sizeof(arr[0]);      //计算数组长度bubble(arr,sz,sizeof(arr[0]),cmp);           //模拟qsort函数实现冒泡排序for (int i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}

5. 小结

以上就是关于qsort函数的内容了,具体还需宝子们去实践,如果觉得该博客对你有用的话,希望一键三连,点个关注不迷路,谢谢支持! 

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

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

相关文章

[Python]可视化地展示出表格中某一列同一数据的出现次数

前言 Matplotlib画图工具的官网地址是 http://matplotlib.org/ Python环境下实现Matlab制图功能的第三方库&#xff0c;需要numpy库的支持&#xff0c;支持用户方便设计出二维、三维数据的图形显示&#xff0c;制作的图形达到出版级的标准。 pandas 是 Python 编程语言中一个…

PHP 使用 PHPMailer 发送电子邮件

1. PHPMailer 介绍 phpMailer 是一个非常强大的 php 发送邮件扩展包&#xff0c;可以设定发送邮件地址、回复地址、邮件主题、html邮件内容和上传附件等&#xff0c;使用起来非常方便。它目前有着有近 4 千万的下载量&#xff0c;是 PHP 开发者实现邮件发送功能的首选扩展包 它…

12.基础乐理-半音、全音

音是有高有底的&#xff0c;音的震动频率越高、音的赫兹越高&#xff0c;我们就说这个音越高&#xff0c;钢琴从左到右&#xff0c;音是逐渐变高的&#xff0c;因变高&#xff0c;它的频率&#xff0c;Hz数是在增加的&#xff0c;如下图&#xff1a; 但是赫兹它动不动就是几百几…

NPL预训练模型-GPT-3

简介及特点 GPT-3是一个由OpenAI开发的自然语言处理&#xff08;NLP&#xff09;预训练模型&#xff0c;它是生成式预训练变换器&#xff08;Generative Pretrained Transformer&#xff09;系列的第三代模型。GPT-3以其巨大的规模和强大的语言处理能力而闻名&#xff0c;具有…

爬虫 | 基于 Python 实现有道翻译工具

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本项目旨在利用 Python 语言实现一个简单的有道翻译工具。有道翻译是一款常用的在线翻译服务&#xff0c;能够实现多种语言的互译&#xff0c;提供高质量的翻译结果。 目录 一、项目功能 二、注意事项 三、代码解析 1. 导入…

DC-9渗透测试复现

DC-9渗透测试复现 目的&#xff1a; 获取最高权限以及flag 过程&#xff1a; 信息打点--sql注入- 文件包含漏洞-Knockd开门开启ssh连接-hyjra爆破-sudo提权(文件追加) 环境&#xff1a; 攻击机&#xff1a;kali(192.168.85.137) 靶机&#xff1a;DC_3(192.168.85.141) …

javaswing + mysql通讯录

javaswingaddressbook 需要代码私聊

结构体及应用;结构体指针及应用;union、enum、typedef三个关键字

结构体及应用 参考文章链接&#xff1a;https://blog.csdn.net/zw1996/article/details/53844585结构体的声明 结构体的初始化 注意如果在定义结构体变量的时候没有初始化&#xff0c;那么后面就不能全部一起初始化了。 /这样是可以的&#xff0c;在定义变量的时候就初始化了…

(十四)C++自制植物大战僵尸游戏windows平台视频播放实现

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/8UFMs VLC库 在Cocos2d-x游戏开发框架中&#xff0c;没有实现windows平台视频播放的功能&#xff0c;需要自定义实现。在本项目中使用vlc库实现windows平台的视频播放功能。 vlc官网&#xff1a;网址 下载完成后&#x…

虚幻引擎源码版安装下载,点击GenerateProjectFiles.bat报错 error NU1101NuGet包问题解决参考方案

开发环境配置与源码安装使用 安装VS2022 按照官方文档安装需要的vs配置 虚幻引擎源代码下载 Epic里面下载的引擎与源代码引擎区别&#xff1a;Epic里面下载的引擎是已经编译过的它的源代码访问权限不完整&#xff0c;源代码版本提供比较完整引擎代码&#xff0c;并且可以修…

MDK stm32怎么生成bin文件

第一种 D:\Keil_v5\ARM\ac5.6\bin\fromelf.exe --bin -o ../../Output/atk_f407.bin ../../Output/atk_f407.axf 空格解析 D:\Keil_v5\ARM\ac5.6\bin\fromelf.exe一个空格--bin一个空格-o两个空格../../Output/atk_f407.bin ../../Output/atk_f407.axf &#xff08;注意后…

ELK,ELFK日志收集分析系统

ELK简介 ELK是一套完整的日志集中处理解决方案&#xff0c;将ElasticSearch&#xff0c;Logstash和Kibana三个开源工具配合使用&#xff0c;实现用户对日志的查询、排序、统计需求。 ELK工作原理 在所有需要收集日志的服务器上部署Logstash&#xff0c;或者先将日志进行集中…

c# .net 香橙派 Orangepi GPIO高低电平、上升沿触发\下降沿触发 监听回调方法

c# .net 香橙派GPIO高低电平、上升沿触发\下降沿触发 监听回调方法 通过gpio readall 查看 gpio编码 这里用orangepi zero3 ,gpio= 70为例 当gpio 70 输入高电平时,触发回调 c# .net 代码 方法1: Nuget 包 System.Device.Gpio ,微软官方库对香橙派支持越来越好了,用得…

SpringBoot多数据源(二)

SpringBoot多数据源AbstractRoutingDataSource&#xff08;二&#xff09; 1.多数据源配置2.多数据源调用流程3.实现 1.多数据源配置 spring-jdbc模块提供AbstractRoutingDataSource,其内部可以包含了多个DataSource&#xff0c; 然后在运行时来动态的访问数据库 2.多数据源…

【Python系列】查看虚拟环境信息和包大小

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Java基于SpringBoot+Vue的蜗牛兼职网系统的研究与实现

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

CSS-布局

display display 属性是用于控制 布局 的最重要的 CSS 属性。display 属性规定是否/如何显示元素。 每个 HTML 元素都有一个默认的 display 值&#xff0c;具体取决于它的元素类型。大多数元素的默认 display 值为 block 或 inline。 block block&#xff1a;块级元素。块级…

越来越多服务区安装智慧公厕是什么原因

随着社会的不断发展&#xff0c;人们对生活质量的要求也越来越高。在这种背景下&#xff0c;越来越多的服务区开始安装智慧公厕&#xff0c;以满足人们在出行过程中的生活需求。那么&#xff0c;为什么越来越多的服务区选择安装智慧公厕呢&#xff1f;这其中究竟有哪些原因呢&a…

你信不信,五分钟快速学习Nginx

Nginx是什么&#xff1f; Nginx 是一个高性能的HTTP和反向代理服务器。它是由俄罗斯程序员Igor Sysoev开发的&#xff0c;最初是为了解决俄罗斯大型的门户网站的高流量问题。 说到反向代理&#xff0c;那么有没有正向代理呢&#xff1f; 正向代理&#xff1a;客户端非常明确要…

Swift Publisher 5 for mac:打造精美版面

Swift Publisher 5 for mac&#xff1a;打造精美版面 Swift Publisher 5是一款专业的版面设计和编辑工具&#xff0c;为Mac用户提供了强大的设计功能和直观的操作界面。以下是关于Swift Publisher 5的功能介绍&#xff1a; 直观易用的界面&#xff1a;用户能够轻松地使用Swift …