qsort()函数详解
一、写在开头
1.1 本节内容
学习C语言中的qsort()函数。
二、qsort()
2.1 函数原型
void qsort(void *base,size_t nmemb,size_t size,int (*compar)(const void *, const void *)
);
函数功能:qsort()函数的功能是对数组进行排序,数组有nmemb个元素,每个元素大小为size。
参数base -base指向数组的起始地址,通常该位置传入的是一个数组名
参数nmemb -nmemb表示该数组的元素个数
参数size -size表示该数组中每个元素的大小(字节数)
参数(*compar)(const void *, const void *) - 此为指向比较函数的函数指针,决定了排序的顺序。
函数返回值:无。
注意:如果两个元素的值是相同,那么它们的前后顺序是不确定的。也就是说qsort()是一个不确定的排序算法。
2.2 compar参数
compar参数指向一个比较两个元素的函数。比较函数的原型应该像下面这样,注意两个形参必须是const void *型,同时在调用compar函数(compar实质为函数指针,这里称它所指向的函数也为compar)时,传入的实参也必须转换成const void *型。在compar函数内部会将const void *型转换成实际类型,见下文:
int compar(const void *p1, const void *p2);
如果compar返回值小于0(<0),那么p2所指向元素会被排在p2所指向元素的前面
如果compar返回值等于0(=0),那么p2所指向元素与p2所指向元素的顺序不确定
如果compar返回值大于0(>0),那么p1所指向元素会被排在p2所指向元素的后面
因此,如果想让qsort()进行从小到大(升序)排序,那么一个通用的compar函数可以写成这样:
int compareMyType(const void *a, const void *b)
{if (*(MyType *)a < *(MyType *)b) return -1;if (*(MyType *)a == *(MyType *)b) return 0;if (*(MyType *)a > *(MyType *)b) return 1;
}
注意:你要将MyType换成实际数组元素的类型。
2.3 一个使用qsort()函数的小例子
/* qsort example */
#include <stdio.h> /* printf */
#include <stdlib.h> /* qsort */int values[] = { 40, 10, 100, 90, 20, 25 };int compare (const void *a, const void *b)
{return (*(int *)a - *(int *)b);
}int main()
{int n;qsort(values, 6, sizeof(int), compare);for (n=0; n<6; n++) printf("%d ", values[n]);return 0;
}
分析一个compare函数。如果a小于b,则返回值为负数(<0),也即a会排在b的前面。同理,若a大于b,则a会排在b的前面。所以,这里的qsort()为从小到大即升序排序。因此,运行结果为:10 20 25 40 90 100
2.4 修改compare(), 使qsort()为降序排序
很简单,只要将上面compare()中的
return (*(int *)a - *(int *)b);
改为:
return (*(int *)b - *(int *)a);
三、参考资料
1. qsort - C++ Reference
2.man qsort
qsort()函数详解相关推荐
- 冒泡排序和qsort函数详解以及如何模拟实现qsort函数
一.冒泡排序 冒泡排序是一种常见的排序方式,它可以把数组元素有序或无序的数组进行重新排序,并使得数组中的元素从大到小或从小到大进行排序(就像泡泡一样). 冒泡排序原理: 每次比较数组中的相邻的两个元素 ...
- qsort函数详解以及模拟实现
qsort函数详解以及模拟实现 一.qsort函数是什么 二.具体的使用 1.参数4(参数3在模拟实现时解释) 2.例子 1.排序整形 2.排序结构体 三.模拟实现qsort 1.参数3 2.模拟排序 ...
- 【C库函数】qsort函数详解
目录 qsort 函数基本原型 参数解读 函数详解 比较函数实现并解读 qsort函数排序代码实现并展示结果 1.排序整型数组 2.排序结构体 qsort 函数是基于快速排序算法实现的一个排序函数 ...
- C语言-qsort函数详解
目录 一.qsort函数是什么 二.使用qsort排序-以升序为例 关于void*型指针: 1.整形数组排序 2.字符数组排序 3.字符指针数组排序 4.结构体数组排序 5.浮点型数组排序 三.使用冒 ...
- 【C进阶】qsort函数详解
⭐博客主页:️CS semi主页 ⭐欢迎关注:点赞收藏+留言 ⭐系列专栏:C语言进阶 ⭐代码仓库:C Advanced 家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们 ...
- C语言-qsort函数详解及使用例
q s o r t ( ) qsort() qsort() 函数是C语言 srdlib.h 库中的排序函数.此函数使用快速排序算法,时间复杂度一般在 O ( l g ( n ) ) O(lg(n)) ...
- C语言 qsort()函数详解 (笔记)
qsort函数,其声明在stdlib.h文件中,时间复杂度为n*log(n). 功能:使用快速排序例程进行排序 用法: void qsort(void *base, size_t nitems, si ...
- C语言 快速排序——qsort函数详解
我们在使用冒泡排序法做题的时候,经常会遇到运算次数过多程序超时的情况,而且冒泡排序法只能对整形数组进行排序. 为了解决这些问题!就使用qsort函数吧! 目录 一.qsort函数使用方法 二.qsor ...
- C语言 - qsort函数详解
文章目录 一.qsort函数简介 1.qsort函数是C标准库<stdlib.h>库中的函数,使用时引入#include <stdlib.h>.** 2.它的函数原型是 voi ...
最新文章
- ZendStudio中,缺少gbk gb2312编码的解决办法
- python判断字符是否为数字或字母
- Android通过for循环批量发送短信
- 计算机科学在生物信息中的应用,生物信息学在基因组学中的应用
- 浅析Linux awk命令
- [react] React为什么要搞一个Hooks?
- Stack Overflow 上人气最旺的 10 个 Java 问题
- 联通 吉比特无源光纤接入用户端设备(GPON ONU)TEWA-800G超级管理员 如何密码获取
- SSD目标检测网络tensorRT推理【附代码】
- Facebook受邀者的邮箱地址披露
- yourshelf是什么意思中文_英语shelf的中文是什么意思
- 记一次nginx配置服务器代理发送请求(外网请求内网ip)
- 计算机专业老师考什么教师,老师!计算机专业的考试也太太太太太太难了!
- wxpy实现微信机器人
- java设置页码_Java 添加页码到Word文档
- CSDN自定义模块高级设置之(2)——设置主页左则及详情页背景(打造节日气氛)
- 使用Vue三种方法实现简单计算器
- 怎么从服务器找回删除的照片,iphone照片删除了怎么找回 苹果手机照片彻底删除恢复方法...
- 数位、位数与计数单位的区别
- 那些著名网站的90年代(转)
热门文章
- JUC队列-LinkedBlockingQueue(二)
- 容器源码解析之容器全貌(一)
- C++ string 使用详解(含C++20新特性)
- 【附段错误原因,最后两个测试点】1052 Linked List Sorting (25 分)【链表类题目总结】
- 【终极方法】 Cannot create PoolableConnectionFactory (Unknown database ‘jdbc‘)
- 【已解决】navigateTo:fail page “/pages/.../...“ is not found
- python中返回上一步操作_selenium操作iframe元素,切入退出操作
- java jpa性能_[Java Performance] 数据库性能最佳实践 - JPA和读写优化
- recyclerview item点击无效_Android列表布局专题(一)RecyclerView
- w3c的html4.0规范,W3C HTML4.0学习