【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,一经查实,立即删除!

相关文章

使用HttpsURLConnection请求https报错

**背景&#xff1a;**公司需要在搭建的生产应用系统中上传图片文件后&#xff0c;自动调用公司打印机打印&#xff0c;但是生产环境的是外网是无法调用公司内网打印机的&#xff0c;但可以将打印机上云&#xff0c;暂时没有这样子做&#xff0c;所以使用了其他方法&#xff0c;…

[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; 但是赫兹它动不动就是几百几…

pandas 中的 tolist() 和 to_list()

在使用pandas的时候&#xff0c;有时候会需要将pandas中的数据类型转换为python中的list&#xff0c;而pandas也提供了tolist()和to_list()这两个方法来实现这一需求 几乎可以认为pandas中的tolist()和to_list()用法没有差别 还顺便介绍了numpy中的tolist()方法&#xff0c;其…

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 需要代码私聊

Day15-Python基础学习之PySpark

PySpark 安装&#xff1a; pip install pyspark # pySpark入门 from pyspark import SparkConf, SparkContext # 创建SparkConf对象 conf SparkConf().setMaster("local[*]").setAppName("test_spark_app") # 基于SparkConf类对象创建SparkContext对象 …

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

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

C语言【复合类型(自定义类型)】

一、结构体 结构体(struct)可以理解为用户自定义的特殊的复合的“数据类型”&#xff1b; 1. 结构体变量的定义和初始化 定义结构体变量的方式&#xff1a; 先声明结构体类型再定义变量名 在声明类型的同时定义变量 // 结构体类型的定义 struct stu {char name[50];int age;…

(十四)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;并且可以修…

密码学 | 承诺:Pedersen Commitment

​ &#x1f951;原文&#xff1a;密码学承诺之 Pedersen Commitment 原理及应用 &#x1f951;写在前面&#xff1a;本文属搬运博客&#xff0c;自己留存学习。 ​ 1 承诺 密码学承诺方案是一个涉及双方的 二阶段 交互协议&#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;注意后…

OWASP 发布十大开源软件风险清单(详解版)

近日&#xff0c;OWASP发文称&#xff0c;尽管软件供应链对开源软件 (OSS) 的依赖程度很高&#xff0c;但业内缺乏一致的用于了解和衡量OSS风险的方法。OSS 风险管理始于许可管理&#xff0c;之后延伸至CVE&#xff0c;但我们仍然缺乏与安全、法律和运营相关的全面的OSS风险管理…

ELK,ELFK日志收集分析系统

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

Python 判断一个数是否为素数

在Python中&#xff0c;判断一个数是否为素数可以通过多种方法实现。以下是一种简单的方法&#xff0c;它通过检查给定数是否有除了1和它本身之外的因数来确定它是否是素数&#xff1a; def is_prime(number):if number < 1:return False # 0和1不是素数if number < 3:…

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

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