一、写在开头

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()函数详解相关推荐

  1. 冒泡排序和qsort函数详解以及如何模拟实现qsort函数

    一.冒泡排序 冒泡排序是一种常见的排序方式,它可以把数组元素有序或无序的数组进行重新排序,并使得数组中的元素从大到小或从小到大进行排序(就像泡泡一样). 冒泡排序原理: 每次比较数组中的相邻的两个元素 ...

  2. qsort函数详解以及模拟实现

    qsort函数详解以及模拟实现 一.qsort函数是什么 二.具体的使用 1.参数4(参数3在模拟实现时解释) 2.例子 1.排序整形 2.排序结构体 三.模拟实现qsort 1.参数3 2.模拟排序 ...

  3. 【C库函数】qsort函数详解

    目录 qsort ​ 函数基本原型 参数解读 函数详解 比较函数实现并解读 qsort函数排序代码实现并展示结果 1.排序整型数组 2.排序结构体 qsort 函数是基于快速排序算法实现的一个排序函数 ...

  4. C语言-qsort函数详解

    目录 一.qsort函数是什么 二.使用qsort排序-以升序为例 关于void*型指针: 1.整形数组排序 2.字符数组排序 3.字符指针数组排序 4.结构体数组排序 5.浮点型数组排序 三.使用冒 ...

  5. 【C进阶】qsort函数详解

    ⭐博客主页:️CS semi主页 ⭐欢迎关注:点赞收藏+留言 ⭐系列专栏:C语言进阶 ⭐代码仓库:C Advanced 家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们 ...

  6. C语言-qsort函数详解及使用例

    q s o r t ( ) qsort() qsort() 函数是C语言 srdlib.h 库中的排序函数.此函数使用快速排序算法,时间复杂度一般在 O ( l g ( n ) ) O(lg(n)) ...

  7. C语言 qsort()函数详解 (笔记)

    qsort函数,其声明在stdlib.h文件中,时间复杂度为n*log(n). 功能:使用快速排序例程进行排序 用法: void qsort(void *base, size_t nitems, si ...

  8. C语言 快速排序——qsort函数详解

    我们在使用冒泡排序法做题的时候,经常会遇到运算次数过多程序超时的情况,而且冒泡排序法只能对整形数组进行排序. 为了解决这些问题!就使用qsort函数吧! 目录 一.qsort函数使用方法 二.qsor ...

  9. C语言 - qsort函数详解

    文章目录 一.qsort函数简介 1.qsort函数是C标准库<stdlib.h>库中的函数,使用时引入#include <stdlib.h>.** 2.它的函数原型是 voi ...

最新文章

  1. ZendStudio中,缺少gbk gb2312编码的解决办法
  2. python判断字符是否为数字或字母
  3. Android通过for循环批量发送短信
  4. 计算机科学在生物信息中的应用,生物信息学在基因组学中的应用
  5. 浅析Linux awk命令
  6. [react] React为什么要搞一个Hooks?
  7. Stack Overflow 上人气最旺的 10 个 Java 问题
  8. 联通 吉比特无源光纤接入用户端设备(GPON ONU)TEWA-800G超级管理员 如何密码获取
  9. SSD目标检测网络tensorRT推理【附代码】
  10. Facebook受邀者的邮箱地址披露
  11. yourshelf是什么意思中文_英语shelf的中文是什么意思
  12. 记一次nginx配置服务器代理发送请求(外网请求内网ip)
  13. 计算机专业老师考什么教师,老师!计算机专业的考试也太太太太太太难了!
  14. wxpy实现微信机器人
  15. java设置页码_Java 添加页码到Word文档
  16. CSDN自定义模块高级设置之(2)——设置主页左则及详情页背景(打造节日气氛)
  17. 使用Vue三种方法实现简单计算器
  18. 怎么从服务器找回删除的照片,iphone照片删除了怎么找回 苹果手机照片彻底删除恢复方法...
  19. 数位、位数与计数单位的区别
  20. 那些著名网站的90年代(转)

热门文章

  1. JUC队列-LinkedBlockingQueue(二)
  2. 容器源码解析之容器全貌(一)
  3. C++ string 使用详解(含C++20新特性)
  4. 【附段错误原因,最后两个测试点】1052 Linked List Sorting (25 分)【链表类题目总结】
  5. 【终极方法】 Cannot create PoolableConnectionFactory (Unknown database ‘jdbc‘)
  6. 【已解决】navigateTo:fail page “/pages/.../...“ is not found
  7. python中返回上一步操作_selenium操作iframe元素,切入退出操作
  8. java jpa性能_[Java Performance] 数据库性能最佳实践 - JPA和读写优化
  9. recyclerview item点击无效_Android列表布局专题(一)RecyclerView
  10. w3c的html4.0规范,W3C HTML4.0学习