qsort()函数功能是对数组进行有序的排序。可用于任何数据类型的排序                                         

  头文件:#include<stdlib.h>


qsort()函数有四个参数

void qsort(1: void* base,  2: size_t num,   3: size_t width,  4:  int( *cmp)(const void *e1, const void *e2))

  • 第一个参数:待排序数组的收元素地址
  • 第二个参数:待排序数组的元素个数
  • 第三个参数:待排序数组的每个元素的大小-单位是字节
  • 第四个参数:是函数指针,比较两个元素的所用函数的地址-这个函数使用者自己实现函数指针的两个参数是: 待比较的两个元素的地址

qsort第四个参数要求使用者提供一个自己定义的比较函数 , cmp参数是qsort函数排序的核心内容,它指向一个比两较个元素的函数,注意两个形参必须是const void*

第四个参数: int( *cmp)(const void *e1, const void *e2)

比较函数cmp的作用就是给qsort指明元素的大小是如何比较的, 比较函数返回值是一个int值

  • 如果e1小于e2 ,返回一个<0的数字
  • 如果e1等于e2,返回一个0
  • 如果e1大于e2,返回一个大于0的数字

这里补充一点void*

  • void*类型的指针 可以接收任意类型的地址
  • void*类型的指针 不能进行解引用操作
  • void*类型的指针 不能进行+-整数的操作

接下来用几种不同类型来定义比较函数:

1:对int类型数组排序

int cmp_int(const void* e1, const void* e2)
{return (*(int*)e1) - (*(int*)e2);
}
int main()
{int nums[] = { 8,4,3,2,5,1,6,9,7,0 };int sz = sizeof(nums) / sizeof(nums[0]);qsort(nums, sz, sizeof(nums[0]), cmp_int);system("pause");
}

如果想降序排列返回 return (*(int*)e2) - (*(int*)e1) 即可


2:对float类型数组排序

int cmp_float (const void* e1, const void* e2)
{return ((int)((float*)e1 - (float*)e2));
}
int main()
{float nums[] = { 8.2,4.0,3.4,2.0,5.35,1.26,6.48,9.1,7.2};int sz = sizeof(nums) / sizeof(nums[0]);qsort(nums, sz, sizeof(nums[0]), cmp_float);system("pause");
}

3:对结构体类型排序

struct stu
{char name[20];int age;
};
int cmp_name(const void* e1, const void* e2)
{//字符串比较用strcmpreturn  strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
}
int main()
{struct stu s[] = { {"猪",20},{"哦",30},{"小",15} };int sz = sizeof(s) / sizeof(s[0]);qsort(s, sz, sizeof(s[0]), cmp_name);system("pause");
}

【C语言】qsort函数使用(详解)相关推荐

  1. c语言 is函数,关于C语言回调函数的详解~

    原标题:关于C语言回调函数的详解~ 01 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义.我在百度上搜了一下, ...

  2. qsort函数用法详解

    qsort()函数用法详解 limabean 本文版权归作者所有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利. 1.qsort函数简介 排序是程序员经常碰到的问题, ...

  3. c语言while函数作用,详解C语言中的while语句

    什么是C语言的while语句?它的作用是什么呢?估计很多初学者对此都是一知半解.下面课课家笔者就为大家详细解释C语言中的while语句的含义和作用. 首先笔者先给大家介绍C语言中的共有的三大常用的程序 ...

  4. c语言fclose函数作用,详解C语言中freopen()函数和fclose()函数的用法

    C语言freopen()函数:打开文件函数,并获得文件句柄 头文件: #include 定义函数: FILE * freopen(const char * path,const char * mode ...

  5. c语言复杂函数转换,详解C语言常用的一些转换工具函数.pdf

    详详解解C语语言言常常用用的的一一些些转转换换工工具具函函数数 1..字字符符串串转转十十六六进进制制 代码实现: void StrToHex(char *pbDest, char *pbSrc, i ...

  6. c语言main函数参数详解,c/c++程序main函数参数解析,以及参数传递的不同方法

    1. 程序运行时传递参数的不同方法: 1)通过命令参数传递参数: 2) 通过txt文件读取参数. 2. 方法举例 1)通过命令参数传递参数,即解析main函数的参数. main函数可以不带参数,也可以 ...

  7. C语言main函数参数详解

    main函数参数 一共有三个: 1.int argc 整型变量 2.char *argv[] 字符指针的数组,通俗一点就是字符串数组,每个元素都是字符串 3.char *envp[] 字符串数组 这三 ...

  8. puts函数,C语言puts函数用法详解

    前面在输出字符串时都使用printf,通过"%s"输出字符串.其实还有更简单的方法,就是使用 puts() 函数.该函数的原型为: # include <stdio.h> ...

  9. R语言axis函数参数详解(坐标轴函数)

    首先我们来看一下函数帮助文档所给定的axis函数参数: axis(side, at = NULL, labels = TRUE, tick = TRUE, line = NA,pos = NA, ou ...

最新文章

  1. 企业管理做不好的根源!「管理智慧」
  2. 优贝共享数据交易所网_2020.9.9号币圈简报:水天共享数据迁移,链淘公告明天开始减产...
  3. SPOJ 375 query on a tree 树链剖分
  4. 设计包含min()函数的栈
  5. 蓝桥杯 方格填数(全排列+图形补齐)
  6. Synchronize和ReentrantLock区别
  7. Linux下Mail命令收集
  8. android 仿美团悬浮,类似美团悬浮框的效果
  9. 使用Python批量随机化文件名
  10. 视网膜屏幕和高清视网膜屏幕
  11. 能否被2整除引发的思考
  12. 数据库——第二章关系运算题整理
  13. 都市丽人全方位能力升维,增长驱动力强劲
  14. 基于java斗地主设计报告_基于java实现斗地主代码实例解析
  15. 格创东智当选深圳市工业互联网联盟首批理事单位
  16. html可以用多个css样式吗,关于多个页面css样式表问题
  17. W中的Event 1A到Event 1J以及Event 2A到2F的含义?
  18. Java高并发处理方案
  19. java 鱼刺图_软件测试技术(三)——使用因果图法进行的UI测试
  20. iOS---使用CAEmitterLayer制作发射粒子的特效

热门文章

  1. jQuery获取或设置元素的属性值prop/attr
  2. 横板闯关游戏中的角色移动
  3. 小程序 配置域名 业务域名_使域名成为您的业务
  4. 运动目标检测——研究方向与难点
  5. Linux unrar命令如何按目录解压rar文件
  6. 栈与堆的区别(内存分配与数据结构)
  7. 对展开运算符和object.assign()的理解
  8. linux移植中出现【can‘t open /dev/ttyO0: No such file or directory】解决方式
  9. CPU Cycle(CPU 周期)、Instruction Cycle(指令周期)、Clock Cycle(时钟周期)
  10. Docker 启动镜像