目录

一、qsort是什么?

二、qsort的功能?

三、qosrt函数详解

1.qsort函数的定义

2.qsort函数的传参

四、qsort的模拟实现(冒泡)

1.如何实现交换?

2.如何实现字节之间的交换


一、qsort是什么?

qsort是C语言库函数里面的一种,包含于#include <stdlib.h>这个头文件里面。

二、qsort的功能?

qsort英语解析:Quick sort,翻译就是快速排序,它的内部实现是通过的快速排序算法来实现的。

功能:对传入的任何数据进行排序,使其变成有序数列。

三、qosrt函数详解

1.qsort函数的定义

在C语言库中是这样定义的:

void qsort (void* base, size_t num, size_t width, int (*cmp)(const void* elem1, const void* elem2))

剖析:

返回类型void:我们改变的是数列的排序,实际只需要进行内存的操作,所以不需要返回值。

参数讲解:

void* base:base基本,即表示应传入初始地址,至于为什么是void*类型,它不知道我们会传入什么数据,而void*类型就像一个垃圾桶一样什么地址都可以仍进去,所以只能用void*类型。

size_t num:num数量,表示应传入的元素个数

size_t width:width宽度,表示应传入的每个元素占的字节大小

int (*cmp)(const void* elem1, const void* elem2):应传入一个比较函数地址,用于比较两个数据的大小,因为传入的数据类型是不确定的,所以我们需要自己定义一个比较函数传到qsort比较函数里面去,以便它知道怎么样去比较两个数据的大小。

2.qsort函数的 传 参

实列代码:

#include <stdio.h>
#include <stdlib.h >//使用者自己实现的比较函数
int Com_int(const void*elem1, const void*elme2)
{return *(int*)elem1 - *(int*)elme2;
}int main()
{int arr[10] = { 10,9,8,7,6,5,4,3,2,1 };int len = sizeof(arr) / sizeof(arr[0]);//数据的个数qsort(arr, len, sizeof(arr[0]), Com_int);//传入,数据首地址,数据个数,每个数据占的字节大                //小,比较函数int i = 0;for (i = 0; i < len; i++)//打印排完序后的数据{printf("%d ",arr[i]);}return 0;
}

四、qsort的模拟实现(冒泡)

1.如何实现交换?

由于qsort函数不知道数据的类型是什么,但是又必须要达到交换两个数据的类容的效果,我们可以从数据的存储这方面想办法,数据储存本质是将自己的二进制序列储存在C语言的程序地址空间中的,所以它只需要将两个数据所占有的全部字节内容交换就可以的。

2.如何实现字节之间的交换

需要交换的字节的大小我们是不知道的,所以我们需要以最低限度来交换地址,将void*型的指针转化为char*类型的指针就可以实现一个字节一个字节之间的交换,这个时候witdh数据宽度的作用和char*型指针的作用就体现出来了

#include <stdio.h>
#include <stdlib.h >
#include <string.h>typedef struct eleme
{int a;
}el;
//使用者自己实现的比较函数
int Com_int(const void*elem1, const void*elme2)
{return *(int*)elem1 - *(int*)elme2;
}
int Com_ch(const void* elem1, const void* elem2)
{return strcmp((char*)elem1, (char*)elem2);
}
int Com_stu(const void* elem1, const void* elem2)
{return (*(el*)elem1).a - (*(el*)elem2).a;
}
//我们使用冒泡排序简单模拟实现一下qsort库函数
void My_Qsort(void* base, size_t num, size_t width, int (*cmp)(const void* e1, const void* e2))
{int i = 0;for (i = 0; i < num - 1; i++){size_t j = 0;for (j = 0; j < num - 1; j++){if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0){//交换两个数据的全部字节for (size_t sz = 0; sz < width; sz++){char tmp = *((char*)base + j * width + sz);*((char*)base + j * width + sz) = *((char*)base + (j + 1) * width + sz);*((char*)base + (j + 1) * width + sz) = tmp;}}}}
}
int main()
{int arr[10] = { 10,9,8,7,6,5,4,3,2,1 };char ch1[] = "fbdcea";struct eleme stu[3];stu[0].a = 30;stu[1].a = 20;stu[2].a = 10;int len = sizeof(arr) / sizeof(arr[0]);int len1 = sizeof(ch1) / sizeof(ch1[0]);int len2 = sizeof(stu) / sizeof(stu[0]);My_Qsort(arr, len, sizeof(arr[0]), Com_int);My_Qsort(ch1, len1, sizeof(ch1[0]), Com_ch);My_Qsort(stu, len2, sizeof(stu[0]), Com_stu);int i = 0;for (i = 0; i < len; i++){printf("%d ",arr[i]);}printf("%s\n",ch1);return 0;
}

qsort库函数详解相关推荐

  1. 【排序】什么都能排的C语言qsort排序详解【超详细的宝藏级别教程】深度理解qsort排序

    [排序]什么都能排的C语言qsort排序详解[超详细的宝藏级别教程]深度理解qsort排序 作者: @小小Programmer 这是我的主页:@小小Programmer 在食用这篇博客之前,博主在这里 ...

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

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

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

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

  4. libxml2常用库函数详解

    libxml2库函数详解 许多事物符合80/20法则,libxml中也是20%的函数提供了80%的功能.下面的列表列出了libxml的主要函数及其用法说明. 1.   全局函数说明 头文件引用 xml ...

  5. C语言字符串库函数详解模拟实现(strlen、strcpy、strcat、strcmp)+字符操作函数+字符转换函数

    字符串库函数详解 一.无字符串长度限制的字符串函数 1. strlen 计算字符串长度函数 2. strcpy 字符串拷贝函数 3. strcat 字符串追加函数 4. strcmp 字符串比较函数 ...

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

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

  7. Python读execl之xlrd库函数详解一:工作簿相关

    Python读execl主要用到xlrd库,用到主要函数详解如下: 准备工作: 安装xlrd库: pip install xlrd 待读取的execl文件,本文使用如下: 文件名:datalist.x ...

  8. C语言-qsort函数详解

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

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

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

最新文章

  1. c语言windows 编程下silder控件,VB6 常用控件 滚动条ScorllBar和Slider控件
  2. java 合并 set_【Java必修课】各种集合类的合并(数组、List、Set、Map)
  3. Python编程基础:第三十一节 文件读取Read a File
  4. 浅谈块级元素和行级元素的相对定位和绝对定位问题
  5. http 412 precondition failed
  6. linux服务器禁止ping和允许ping的方法
  7. 二分法的计算机应用,二分法(数学领域术语)_百度百科
  8. php 面向对象的理解,我对php面向对象的细微理解
  9. Go 1.5交叉编译
  10. 大厂前端必备技能Webpack原理剖析
  11. RabbitMQ~一些术语和最消息的生产
  12. Linux - ATT汇编基础
  13. 这 10 个 Python 可视化工具,你用过哪些?
  14. Android Studio向SVN上传新项目
  15. VS2013 VS2015应用程序无法正常启动0xc000007b。
  16. linux没有安装防火墙,Linux安装防火墙
  17. 一天狂点3.7万个赞! 男子因“点赞过多”被大众点评网处罚 法庭上吵翻
  18. word2007制作目录
  19. NYOJ-47 过河问题
  20. c++ min/max

热门文章

  1. 《见与不见》原题《班扎古鲁白玛的沉默》   作者:扎西拉姆·多多
  2. 使用face_recognition(一)人脸识别
  3. 查询姓李老师的mysql_day41:MYSQL:select查询练习题
  4. 模拟芯片和数字芯片的比较
  5. 泛零售企业需要的数据中台长什么样?| 「数智泛零售」干货集锦
  6. oracle ebs 的预克隆
  7. springBoot将excel文件数据导入数据库
  8. 第一篇CSDN博客 python爬虫豆瓣排名前250的电影
  9. Spring Boot 微信点餐开源系统!
  10. 使用VS Code 插件, 快速入门超账Fabric(一) : 知识回顾