目录

qsort的介绍

测试

排序int类型

排序char类型

排序结构体类型


qsort的介绍

c语言中有很多排序,比如常见的选择排序,冒泡排序,插入排序,但是c语言的库函数中,有一个qsort()函数,可以实现快速排序,性能更好,下面就是对qsort的介绍。

头文件:<stdlib.h>

函数原型:

void qsort (   void* base,
                     size_t nmemb,
                     size_t size,
                     int (*compar)(const void* e1, const void* e2)
                );

base是指:  待排序数据的起始位置

memb是指:待排序的数据的元素个数

size是指:    待排序的数据的元素大小(单位是字节)

最后一个参数:比较2个元素大小的函数指针(需要自己写)

对于最后一个参数(下文称作“自编函数”),在cplusplus里面找到如下的资料:

不难看出, int (*compar)(const void* e1, const void* e2)的返回值有3种,分别是>0,<0和=0。返回值>0时,把e1排到e2后面;返回值<0时,把e1排到e2前面;返回值=0时,不改变顺序。

测试

排序int类型

如下,测试qsort对于int类型数据的排序:

cmp_by_int完全按照上述要求来写,返回值是int类型,并且只有>0,<0和=0三种可能,两个const void* 类型的参数。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>int cmp_by_int(const void* e1, const void* e2)
{return *(int*)e1 - *(int*)e2;
}int main()
{int a[10] = { 3,5,22,456,74,39,6,66,89,1 };int sz1 = sizeof(a) / sizeof(a[0]);qsort(a,sz1,sizeof(a[0]),cmp_by_int);return 0;
}

通过调试,监视a,得到运行后的结果,不难看出,a数组里面的数据已经按从小到大的顺序排好:

另:如果把cmp_by_int里面,改成return *(int*)e2 - *(int*)e1; 那么将会得到从大到小排序的数据。

对于double类型和float类型,和int类型类似,这里也不过多测试,只需要在自编函数里面e1和e2强制类型转换成double类型或者float类型即可。

排序char类型

对于strcmp()函数,由于其返回值就是-1,0和1,符合要求,所以直接return就行。需要注意的是,strcmp()里面,两个参数是填写的地址,所以强制类型转换之后,不需要再进行解引用操作。

这里sz4=sizeof(d)/10;d[4][10]是开辟了一个二维数组,看成四个一维数组成,每个一维数组是10个字节的大小, sizeof(d)求出的是整个数组的大小,无疑是4*10=40(字节),但是要排序操作的实际上是4个字符串,所以用整个数组大小整除每个字符串所占空间(无论字符串有没有占满10个字节,都是10,因为开辟空间就是开辟的10个)。(当然在这里直接写4也可以)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>int cmp_by_char(const void* e1, const void* e2)
{return strcmp((char*)e1, (char*)e2);//strcmp()里面是填写地址
}int main()
{char d[4][10] = { "hello","zhangsan","lisiw","using" };int sz4 = sizeof(d) / 10;qsort(d, sz4, 10,cmp_by_char);return 0;
}

排完序的结果如下:

排序结构体类型

代码如下:

按照结构体里面的age从小到大排序。由于排序的是结构体,所以自编函数传参后要强制类型转换成结构体类型,然后再到结构体类型里面的数据。同时,这个时候排序是对一个个结构体类型进行排序,所以qsort的第三个参数(每个元素的空间大小)是一个该结构体类型所占的空间大小。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>typedef struct student
{char  name[20];int age;
}stu;int cmp_by_struct_int(const void* e1, const void* e2)
{return ((stu*)e1)->age - ((stu*)e2)->age;
}int main()
{stu arr[4] = { {"zhangsan",90},{"lisi",18},{"wangwu",66},{"wulie",20}};int sz5 = sizeof(arr) / sizeof(arr[0]);qsort(arr,sz5,sizeof(arr[0]),cmp_by_struct_int);return 0;
}

排序后的结果如下:

对于结构体里面char类型数据排序如下:

由于结构体里面name本身就是地址,所以strcmp()里面的参数,只需要如下取值就行。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>typedef struct student
{char  name[20];int age;
}stu;int cmp_by_struct_char(const void* e1, const void* e2)
{return strcmp(((stu*)e1)->name,((stu*)e2)->name);
}int main()
{stu arr1[4] = { {"zhangsan",90},{"lisi",18},{"wangwu",66},{"wulie",20} };int sz6 = sizeof(arr1) / sizeof(arr1[0]);qsort(arr1, sz6, sizeof(arr1[0]), cmp_by_struct_char);return 0;
}

按名字排序后的结果:

以上就是个人对目前qsort()函数的理解,有什么错误欢迎再评论区指正哦!

c语言的qsort快速排序函数相关推荐

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

    直接进入主题,在c语言中qsort函数是用来快速排序的,qsort有4个参数,分别是数组地址,数组元素个数,数组元素字节大小和一个比较数组元素的函数指针.让我来看一下官方给出的使用标准,上图: 让我们 ...

  2. [C语言] qsort 快速排序函数讲解

    qsort库函数作用:执行快速排序 其需要引用的头文件是 : <stdlib.h> qsort 默认(按照 e1,e2 顺序)排的是升序 其中每个参数解释是: 关于比较两个元素的函数 : ...

  3. c语言实现qsort排序函数

    目录 1.了解一下qsort函数的参数和实现思路 2.实现代码: 1.了解一下qsort函数的参数和实现思路 A.先看看参数: void* base:需要排序数组的首地址. size_t num:数组 ...

  4. [C/C++基础知识] 一篇就让你彻底搞懂qsort快速排序的文章

    最近在做LeetCode的题目.面试和笔试后发现经常考察快速排序的知识.通过这篇文章介绍,能让你彻底的了解和学习快排,主要从一下三个部分进行介绍:         一.C语言实现qsort快速排序   ...

  5. 【C语言】快速排序函数qsort()

    快速排序函数 函数原型 各种数据类型的升序排序函数 1. 整型 2. double型 3. 字符排序 4. 字符串排序 1. 根据字符串首字母排序 2. 根据字符串长度排序 3. 按字典排序字符串. ...

  6. c语言快速排序代码不用函数,C语言 快速排序函数

    C语言 快速排序函数用法 #include #include #include struct student { int id; char name[12]; char sex; }; int com ...

  7. C语言 快速排序函数

    C语言 快速排序函数用法 #include <stdio.h> #include <stdlib.h> #include <string.h> struct stu ...

  8. 趣谈C语言之qsort函数

    在学习c语言的时候,我们接触到了冒泡排序,利用冒泡排序我们可以快速的对一个数组进行大小的比较,可是大家有没有想过一个问题,有没有一种排序方式可以排序任何类型的元素类型的呢?答案是有的,它是qsort函 ...

  9. C语言排序的方法(冒泡排序,qsort快速排序)

    文章目录 一.冒泡排序 二.qsort快速排序 三.qsort函数的模拟实现 一.冒泡排序 #include <stdio.h> void bubble_sort(int* arr,int ...

最新文章

  1. R语言ggplot2可视化2d密度图:可视化二维密度图并将两个二维密度图重叠起来、Overlay two ggplot2 stat_density2d plots
  2. 创建快捷方式命令_如何使用桌面快捷方式运行命令提示符命令
  3. Rabbitmq 极简实现
  4. MongoDB中的读写锁
  5. 神经网络与深度学习(邱锡鹏)-学习笔记
  6. java版b2b2c社交电商spring cloud分布式微服务(二) 服务消费者(rest+ribbon)
  7. 事务默认的传播属性和事务默认的隔离级别
  8. KAFKA 集成 SpringBoot2 消息发送和消费消息(基础篇)
  9. js手机号中间四位_11位手机号码隐藏中间四位数,学会Substitute函数一键搞定!...
  10. Eclipse中Program arguments和VM arguments的说明
  11. 如何使用初始化列表消除冗余C++代码
  12. SpreadJS 15.1 CN 与 SpreadJS 15.1 EN
  13. PCBlayout设计
  14. Cisco NAT --- ip nat enable NVI方式
  15. Unity 3D系列 摄像机围绕主角进行旋转、缩放
  16. 浪潮服务器内存故障怎么修复,浪潮GS客户端出现内存溢出和存储空间不足的问题说明和解决方案 | 浪潮888博客...
  17. 装上后这 10个扩展后,VSCode 猛虎添翼,无敌了
  18. chart.js基本知识——调整图表尺寸
  19. Conda安装失败:Solving environment: failed with initial frozen solve. Retrying with flexible solve.
  20. 给她讲最爱的SpringBoot源码

热门文章

  1. 百度地图 JavaScript API 极速版 开发体会
  2. 自然语言处理之——词性标注和命名实体识别
  3. 分享四款协作方便的平面设计软件
  4. 2021年真正强大、最值得推荐的的视频播放器(全平台)
  5. 【广告算法工程师入门 6】【转】20万、50万、100万的算法工程师,到底有什么区别?
  6. 第4关:求sinx近似值
  7. Windows下Rstudio的下载安装步骤详解
  8. 重磅推出!安全扫码专业委员会数智商盟码上线了!!
  9. 搞定迅雷固件在TP-LINK WR720N,127.0.0.1 9000 获取不到激活码
  10. 闪讯利用openwrt路由器拨号教程(二)