【C语言】qsort函数

目录

简介

 头文件

​编辑 函数原型:

参数函数如何写:

参数函数要求:

qsort对整性数据的排序:

qsort对字符型数据的排序:

对结构体类型的内部元素排序:


函数的底层是以快速排序实现的 

 但是本文不深入探讨快速排序是如何进行的,你可以从上面的动图可以有个大致了解。


 

一,简介

qsort函数(quick sort)是八大排序算法中的快速排序,能够排序任意数据类型的数组其中包括整形,浮点型,字符串甚至还有自定义的结构体类型。 

 二,头文件<stdlib.h>

 三,函数原型:

void qsort (void* base,//要排序的对象的第一个元素的首地址size_t num, //对象的个数size_t size,//每一个对象的大小 Size in bytesint (*compar)(const void*,const void*));//Pointer to a function that compares two elements.(并且这个函数要自己写)

四,参数函数如何写:

4.1参数函数要求:

必须与qsort函数的第四个参数的函数指针的类型相同

        两个参数是两个空类型的指针

        返回值为整形,对于元素来说:

        如果值小于0,第一个小于第二个;

        如果值等于0,第一个等于第二个;

        如果值大于0,第一个大于第二个;

(这些比较都是以你定义的函数为标准,而比较出来的)

五,具体实例

5.1 qsort对整性数据的排序:


//两个整形元素比较可以用><=来比较
int in_cmp(const void* a,const void* b)
{return *((int*)a) - *((int*)b);//void*不可直接解引用
}
int main1()
{int arr[8] = {5,8,9,4,3,2,8,1};qsort(arr,sizeof(arr)/sizeof(arr[0]),sizeof(int),in_cmp);for(int i = 0;i < 8;i++){printf("%d ",arr[i]);}return 0;
}

 着重点:

1.qsort函数第四个参数(函数指针的类型)与库函数完全一致;

2.传入的元素的个数,每个元素的大小都可以借助sizeof操作符实现;

3.其余注意写在代码注释中;

5.2 qsort对字符型数据的排序:


//比较两个字符,字符在内存中以ASCII、码存储,可用<>=比较int ch_cmp(const void* ach,const void* bch)
{return *(char*)ach - *(char*)bch;//强制类型转化为char*
}
int main2()
{char *str = "hisndksni";//str为字符串常量,不能被改变char p[10];//可以创建字符数组,把str内容copy过来memcpy(p,str,10);int len = strlen(str);qsort(p,len,sizeof(char),ch_cmp);printf("%s",p);return 0;
}

 注重点:

1.对字符串排序,结尾的\0可忽略,所以可用strlen计算元素的个数;

2.字符串常量不能被改变,初始化时要注意;

5.3 对结构体类型的内部元素排序:


struct stu
{int score;char* name;int hight;
};int stu_cmp_by_score(const void* p1,const void* p2)
{return ((struct stu*)p1)->score - ((struct stu*)p2)->score;
}
int main()
{struct stu arr[]= {{90,"zhangsan",175},{88,"lisi",180}};int sz1 = sizeof(arr)/sizeof(arr[0]);qsort(arr,sz1,sizeof(arr[0]),stu_cmp_by_score);for(int i = 0;i < sz1;i++){printf("%d ",arr[i].score);}return 0;
}

 1.结构体指针写完整;

2.适当的用括号让自己的代码逻辑更加清晰;


cplusplus的qort函数icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/cstdlib/qsort/?kw=qsort


完~

未经作者同意禁止转载

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

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

相关文章

OpenCvSharp从入门到实践-(02)图像处理的基本操作

目录 图像处理的基础操作 1、读取图像 1.1、读取当前目录下的图像 2、显示图像 2.1、Cv2.ImShow 用于显示图像。 2.2、Cv2.WaitKey方法用于等待用户按下键盘上按键的时间。 2.3、Cv2.DestroyAllWindows方法用于销毁所有正在显示图像的窗口。 2.4实例1-显示图像 2.4实例…

数据分析基础之《matplotlib(1)—介绍》

一、什么是matplotlib 1、专门用于开发2D图表&#xff08;包括3D图表&#xff09; 2、使用起来及其简单 3、以渐进、交互方式实现数据可视化 4、matplotlib mat&#xff1a;matrix&#xff08;矩阵&#xff09; plot&#xff1a;画图 lib&#xff1a;库 二、为什么要学习m…

内部网关协议_路由信息协议RIP_开放路径优先OSPF协议_基本知识

目录: 因特网路由选择协议概述 路由信息协议RIP 开放路径优先OSPF协议 因特网路由选择协议概述 一.路由选择分类 静态路由选择和动态路由选择 静态路由选择: 采用人工配置的方式给路由器添加网络路由、默认路由和特定主机路由等路由条目。静态路由选择简单、开销小&#…

X2Keyarch迁移工具实战 | 将CentOS高效迁移至浪潮云峦操作系统KeyarchOS

X2Keyarch迁移工具实战 | 将CentOS高效迁移至浪潮云峦操作系统KeyarchOS 1. 搭建仿真线上业务环境2. 安装KeyarchOS操作系统和X2Keyarch迁移工具3. 将CentOS系统业务迁移至KeyarchOS系统 浪潮信息云峦操作系统KeyarchOS基于Linux Kernel、OpenAnolis等开源技术自主研发的一款服…

原理Redis-SkipList

SkipList ZipList和QuickList的共同特点是节省内存。在遍历元素时&#xff0c;只能从头到尾或从尾到头&#xff0c;所以在查找头尾元素性能还是不错的&#xff0c;但是中间元素查询的性能就会差。 **SkipList&#xff08;跳表&#xff09;**首先是链表&#xff0c;但与传统链表…

【C++入门到精通】 Lambda表达式 C++11 [ C++入门 ]

阅读导航 引言一、C98中的一个例子二、Lambda表达式1. Lambda表达式语法&#xff08;1&#xff09;Lambda表达式各部分说明&#xff08;2&#xff09;捕获列表说明 三、Lambda表达式的底层原理温馨提示 引言 当今软件开发行业的快速发展和日益复杂的需求&#xff0c;要求程序员…

万界星空科技SMT行业生产管理MES系统解决方案

一、SMT行业特点&#xff1a; SMT&#xff08;Surface Mounted Technology&#xff09;作为电子组装行业里首先的技术和工艺&#xff0c;选择合适的MES解决方案来保障SMT生产的成功至关重要。 电子行业涉及的范围非常广&#xff0c;包含了汽车、电脑、电视、手机等产品上&…

第三节-Android10.0 Binder通信原理(三)-ServiceManager篇

1、概述 在Android中&#xff0c;系统提供的服务被包装成一个个系统级service&#xff0c;这些service往往会在设备启动之时添加进Android系统&#xff0c;当某个应用想要调用系统某个服务的功能时&#xff0c;往往是向系统发出请求&#xff0c;调用该服务的外部接口。在上一节…

逸学java【初级菜鸟篇】9.5枚举

hi&#xff0c;我是逸尘&#xff0c;一起学java吧 枚举是信息的标志和分类 当一个变量有几种固定可能的取值时&#xff0c;就可以将它定义为类型的枚举。 优点&#xff1a;代码可读性好&#xff0c;入参约束严谨&#xff0c;代码优雅&#xff0c;是最好的信息分类技术&#x…

探秘开发app与小程序:一场技术与创新的博弈

app与小程序&#xff1a;一场技术与创新的博弈随着科技的飞速发展&#xff0c;移动应用程序已经成为我们日常生活中不可或缺的一部分。在这个充满竞争的时代&#xff0c;企业纷纷投身于开发各类移动应用&#xff0c;以期在市场中占据一席之地。然而&#xff0c;面对多样化的应用…

opencv-2D直方图

cv2.calcHist() 是 OpenCV 中用于计算直方图的函数。它可以计算一维或多维直方图&#xff0c;用于分析图像中像素值的分布。 基本的语法如下&#xff1a; hist cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])参数说明&#xff1a; images:…

【OpenCV实现图像:使用OpenCV进行图像处理之透视变换】

文章目录 概要计算公式举个栗子实际应用小结 概要 透视变换&#xff08;Perspective Transformation&#xff09;是一种图像处理中常用的变换手段&#xff0c;它用于将图像从一个视角映射到另一个视角&#xff0c;常被称为投影映射。透视变换可以用于矫正图像中的透视畸变&…