c语言中库函数qsort是无类型排序,且需要引入头文件 #include <stdlib.h>,查文档发现:

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

注意:size_t在这里就是unsigned int

此函数需要传入四个参数,第一个参数是要排序的一组元素的首地址,第二个参数是要排序的元素的个数,第三个参数是元素所占有的字节数。

第四个参数明显是一个函数指针,指向返回值为int,形参列表为两个任意类型指针的函数。所以这个函数是需要我们自己写的,那么这跟排序有什么关系呢?

compar指针所指向的函数中,其中两个指针变量要接收的其实是要排序的一组元素中任意两个元素的地址,然后对这两个指针解引用后比较这两个值,假如解引用后的值是x和y,那么:

if (x>y){return 1;
}
else if (x < y){return -1;
}
return 0;

返回1代表升序排序,返回-1代表降序排序。接下来来写一写这个函数。

#include <stdio.h>
#include <windows.h>
#include <assert.h>
#include <stdlib.h>
int ComInt(const void *xp,const void *yp){//要排序的元素的任意两个元素的地址传入assert(xp);//检测指针合法性assert(yp);const int* x = (const int*)xp;//将指针类型转换为要排序的元素的类型const int* y = (const int*)yp;if (*x > *y){//第一个大于第二个,返回1升序排序return 1;}else if(*x < *y){//第一个小于第二个,返回-1降序排序return -1;}else{return 0;}
}
int main(){int arr[] = { 11,11, 5, 3, 6, 94, 64, 89, 6, 4, 9 };size_t num = sizeof(arr) / sizeof(arr[0]);//求元素的个数qsort(arr, num, sizeof(int),ComInt);for (int i = 0; i < num; i++){printf("%d\n", arr[i]);}
}

运行结果如上图,此时如果要降序排序,只需要将if else语句中的返回值-1和1调换位置即可。

那么接下来使用qsort函数来对一组字符串进行排序,字符串的比较规则如下:

从字符串左边开始,一次比较每个字符,直接出现差异、或者其中一个串结束为止。比如ABC与ACDE比较,第一个字符相同,继续比较第二个字符,由于第二个字符是后面一个串大,所以不再继续比较,结果就是后面个串大。

因为字符串只能用指针指向或者用数组进行保存,所以多个字符串要么用一维的指针数组保存,要么用二维数组保存,在这里我用一维的指针数组来保存多个字符串,便于理解。

#include <stdio.h>
#include <windows.h>
#include <assert.h>
#include <stdlib.h>
int ComChar(const void *xp, const void *yp){//xp和yp此时是二级指针assert(xp);//检测指针合法性assert(yp);const char **x=(const char **)xp;//强转为char**类型const char **y=(const char **)yp;char *_x = *x;//一次解引用代表的是字符串char *_y = *y;while (*_x || *_y){//在解引用代表的是第一个字符,用循环来依此比较各个字符,直到出现结果if (*_x > *_y){return 1;}else if (*_x < *_y){return -1;}_x++;_y++;}return 0;
}
int main(){char *arr2[] = { "acjif", "ajgija", "hgagg", "oijgoia", "djigeg" };size_t num2 = sizeof(arr2) / sizeof(arr2[0]); qsort(arr2, num2, sizeof(char *), ComChar);for (int i = 0; i < num2; i++){printf("%s\n", arr2[i]);}system("pause");return 0;
}

以上代码要注意一点:在调用ComChar函数传参时是传递了任意两个数组元素的地址,也就是说传递的是字符串指针的地址,是一个二级指针,但是要进行比较的是字符串中的单个字符,所以在ComChar函数中要进行两次解引用才能得到单个的字符。运行结果如下:

C语言中库函数qsort的使用相关推荐

  1. 【C语言】库函数qsort的使用

    一.回调函数 二.库函数qsort 三.使用qsort排序整型数组 四.使用qsort排序结构体 1.使用qsort排序结构体中的字符成员 2.使用qsort排序结构体中的整型成员 五.基于冒泡排序的 ...

  2. 【初始C语言】关于C语言中库函数的学习

    ​ #关于库函数: 在c语言中,有一些函数是我们经常所需要并且去运用的,比如printf,scanf等它们就是由c语言本身提供给我们的,也就是由c语言的标准库提供,我们将这些函数称为库函数 ##关于库 ...

  3. memcpy函数_如何理解c语言中的回调函数

    在计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序. 这段话不是那么好理解,不同语言实现回调的方式有些许不 ...

  4. 如何理解c语言中的回调函数

    在计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序. 这段话不是那么好理解,不同语言实现回调的方式有些许不 ...

  5. C语言,库函数中qsort的用法,及解释

    C语言库函数qsort的使用 目录 C语言库函数qsort的使用 qsort简介 原理: 函数原形及逐步分析 一:格式 二:分段解析 代码示例 总结 qsort简介 大家都知道冒泡排序,但是却排序有一 ...

  6. C语言库函数qsort()

    C语言库函数qsort() 此模板参考链接 qsort()--快速排序 qsort()函数声明 void qsort(void *base, size_t nitems, size_t size, i ...

  7. qsort — c语言中自带的排序函数(附带void*、回调函数知识点

    因为总是忘记有qsort这个函数,导致遇到需要排序的题的时候,总是要写着类似的代码,所以特此单独把qsort拿出来单独整理一遍,让自己能够熟练掌握,也以免之后忘记了qsort可以拿自己的文章看. 目录 ...

  8. 在汇编程序中调用C语言的库函数,h转inc

    在汇编语言中如果能够调用C语言的库函数,有时会很方便 先给个示例程序: .386 .model flat,stdcall option casemap:none ;Include定义 include ...

  9. Python:python语言中与时间有关的库函数简介、安装、使用方法之详细攻略

    Python:python语言中与时间有关的库函数简介.安装.使用方法之详细攻略 目录 与时间有关的库函数 案例应用 1.打印程序块前后运行时间 #T1.采用time库

  10. c语言设置输出字符大小_C语言中常用的几个头文件及库函数

    点击上方"C语言中文社区",选择"设为星标★" 技术干货第一时间送达! 来源:https://www.jb51.net/article/124594.htm 这 ...

最新文章

  1. Java注解---通俗易懂
  2. 【一语点醒梦中人】如何优雅地合并两个JSON对象 → Object.assign(a, b)和Object.assign({}, a, b)的区别
  3. 神策数据入选《2020 爱分析·数据智能厂商全景报告》
  4. python 文本相似度现状_python文本相似度分析
  5. 使用分治思想求解最大子序列
  6. CUDNN学习笔记(2)
  7. 消息中间件的研究 (一)
  8. 关于更换PC版浏览器推荐
  9. SCI/SSCI期刊列表已更新,这几本期刊被剔除~
  10. ADC 前端电路的五个设计步骤(转载)
  11. 服务器行业深度解析:服务器未来需求知多少
  12. 地铁线路项目-结对编程
  13. matlab中ones函数的使用方法详细介绍(附matlab代码)
  14. 动手学:深度学习Task2
  15. 多租户SaaS平台数据库方案
  16. 什么是虚拟机,虚拟机有什么妙用?
  17. pycurl和urllib2的比较
  18. web前端期末大作业 HTML+CSS+JavaScript web课程设计网页规划与设计 企业网站制作
  19. 阿里云数据库优惠活动: 数据库MySQL配置价格表出炉
  20. Hadoop全分布平台搭建-单词统计[完整]CentOS[详细]

热门文章

  1. PC网站接入微信登陆流程一:微信开放平台账号注册和开发者资质认证
  2. 计算机基础文化知识板书,计算机文化基础考试
  3. 编程中,有哪些好的习惯从一开始就值得坚持?
  4. javascript版的等额本息计算器
  5. 深度内幕丨揭秘积分墙新颖反作弊
  6. Java中.setvalue(-1)_Java State.setValue方法代碼示例
  7. PS 2020版本放大工具无法鼠标左右拖动精细放大的解决方案
  8. 不擅长演讲?值得技术收藏的PPT演讲底层逻辑--大树模型
  9. 三亚旅游攻略-自由人实用指南
  10. 《计算机入门》模拟卷 b卷,《计算机入门》模拟试卷B.doc