目录

一,qsort函数的介绍

二,实例,用qsort函数,实现冒泡排序,把降序改为升序

三,用qsort函数,排序结构体变量

四,自己实现一个qsort函数,用冒泡思维写

1,分析判断两个数据是否需要交换

2,如何交换,

五,自己实现的qsort函数,的整体使用

一,qsort函数的介绍

void qsort(void* base, size_t num, size_t width, int(*cmp)(const void* e1, const void* e2))

首先它是一个排序函数!能量巨大,可以排序任意类型的数据,整型,数组,结构体,字符等

qsort函数一共有四个参数:

1,void* base:是要排序的数据的起始位置,这是一个指针,返回类型为空的,void类型,必须是void*,不能擅作主张修改,改的是base,起始地址,用自己想用的。

2,size_t num:是待排序的数据元素的个数,传过去一个整型

3,size_t width:是待排序的数据元素的大小,单位是字节。传过去一个整型

4,int(*cmp)(const void* e1, const void* e2)这是函数指针,比较函数,可以自己去设计,具体怎么比较,看题目的具体安排。它的规定是,e1<e2 返回<0,e1=e2返回=0,e1>e2返回>0。

这样才能比较,这是这个函数的自有规定,按照这个规定来设计就行。注意e1是你要比较的元素的一个地址,e2是另一个元素的地址。

二,实例,用qsort函数,实现冒泡排序,把降序改为升序

1,代码逻辑简单,重点是cmp1函数

 解析:两个元素地址传过来,是void*类型的,根本不可以进行加减操作,一定要把它强制类型转换为int*类型的,才可以进行加减操作。

这样,两个整型元素相减,返回值要么是>0,要么是=0,要么是<0,符合函数的规定。

然后,按照相减之后的值排序,例如 9-5=4  9-3=6,直接推出,9比5大。而结果的6比4大,间接推出5又比3大,所以,3,5,9排序成功,9在最后面,依次类推,遍历了各种情况,排序为由小到大的升序。

 想要把升序,改为降序也可以,把return 的p1和p2调换即可。我想不用过多演示了吧。

三,用qsort函数,排序结构体变量

大致流程和上述例子一样,我把解析部分写在注释里面了,核心点是指针的强制类型转换,把void*类型转换为结构体指针类型,进行运算比较。

四,自己实现一个qsort函数,用冒泡思维写

1,分析判断两个数据是否需要交换

4个参数是固定的,循环的趟数是固定的,需要修改的是,判断两个数据,是否需要交换,以及怎么交换。

cmp函数和上述的一样,为什么if语句里面是,强制类型转换为char*呢?

因为在字节这个单位里面,char类型的最小,是一个字节,把整型4个字节强制类型转换为一个字节,然后地址加上宽度*j,就相当于跨过了一个整型,到了下一个整型的地址。

这绝对不是多此一举,下次如果是浮点型,结构体类型,就跨越 宽度*j,这种写法是通用方式。以此判断出两个数据的大小,到底是否需要交换。

精髓:要运算的是整型,但是转换为(char*)base+size*j,表示了一个整型地址,给cmp函数传过去,接收的是void*类型,无法加减,又得强制类型转换为int*类型。。。。。。。。。。。看到这要开骂了?  真不是画蛇添足。。

真得需要仔细琢磨,因为函数强大,以后可以用于各种情况,所以每一步的操作就得考虑其余情况的使用,这是通用版本。不能想当然的,就都使用整型指针不是最方便?那样这题是方便了,下次换个类型就一点没用了。。。。。。。

return 返回正数,说明前面的数大,需要交换。同理可知。

2,如何交换,

 传参,传过来两个数据的地址,和宽度大小size,具体多少个字节。循环几次由字节数控制。强制类型转换为char*是一个字节,整型是4个字节,两个数据交换就需要4次,这是一个字节一个字节是交换,4次之后,就是整体交换完毕了。

看图吧,1个整型四个字节,1和1交换,2和2交换,3和3交换,4和4交换。这样具体一个整型就交换完毕了,以后要是浮点型,结构体,也可以这样,无非是循环多一点。

((char*)p1 + i)就是第一个数据的起始地址,((char*)p2 + i)是第二个数据的起始地址。i 每走一步,就是挪一个字节。

五,自己实现的qsort函数,的整体使用

 整体没毛病,就是有点绕的慌

要是想要修改,排降序,只需要改动cmp函数那里就ok了,结构体排序也可以,但要记住传参过去,要强制类型转换。

C语言qsort函数的使用,及自己实现的qsort函数相关推荐

  1. 《C语言初阶进阶完整教程》- 已完结 - qsort函数使用方法+(数组,结构体,手动实现函数)

    目录 前言 一.解释qsort函数 1.函数原型 2.深度解析comper比较函数 二.函数使用 1.int 2.结构体 三.手动实现函数 2.核心代码(两段) 四.升级使用方法 前言 提示:此文章可 ...

  2. ACMNO.41C语言-数字调序 有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图。写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数

    题目描述 有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图. 写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数. 输入 输入数据的个数n n个整数 移动的位置m ...

  3. R语言ggplot2可视化:ggplot2可视化散点图并使用geom_mark_circle函数在数据簇或数据分组的数据点周围添加圆圈进行注释(自定义圆圈的大小)

    R语言ggplot2可视化:ggplot2可视化散点图并使用geom_mark_circle函数在数据簇或数据分组的数据点周围添加圆圈进行注释(自定义圆圈的大小) 目录

  4. R语言使用randomForest包构建随机森林模型(Random forests)、使用importance函数查看特征重要度、使用table函数计算混淆矩阵评估分类模型性能、包外错误估计OOB

    R语言使用randomForest包中的randomForest函数构建随机森林模型(Random forests).使用importance函数查看特征重要度.使用table函数计算混淆矩阵评估分类 ...

  5. R语言data.table导入数据实战:data.table中编写函数并使用SD数据对象

    R语言data.table导入数据实战:data.table中编写函数并使用SD数据对象 目录 R语言data.table导入数据实战:data.table中编写函数并使用SD数据对象 #data.t ...

  6. R语言使用rpart包构建决策树模型、使用prune函数进行树的剪枝、交叉验证预防过拟合、plotcp可视化复杂度、rpart.plot包可视化决策树、使用table函数计算混淆矩阵评估分类模型性能

    R语言使用rpart包构建决策树模型.使用prune函数进行树的剪枝.使用10折交叉验证选择预测误差最低的树来预防过拟合.plotcp可视化决策树复杂度.rpart.plot包可视化最终决策树.使用t ...

  7. R语言ggplot2可视化:使用ggfortyify包中的autoplot函数自动可视化时间序列数据(Time Series Plot From a Time Series Object (ts))

    R语言ggplot2可视化:使用ggfortyify包中的autoplot函数自动可视化时间序列数据(Time Series Plot From a Time Series Object (ts)) ...

  8. R语言data.table导入数据实战:data.table使用by函数进行数据分组(aggregate)

    R语言data.table导入数据实战:data.table使用by函数进行数据分组(aggregate) 目录 R语言data.table导入数据实战:data.table使用by函数进行数据分组( ...

  9. R语言广义线性模型函数GLM、广义线性模型(Generalized linear models)、GLM函数的语法形式、glm模型常用函数、常用连接函数、逻辑回归、泊松回归、系数解读、过散度分析

    R语言广义线性模型函数GLM.广义线性模型(Generalized linear models).GLM函数的语法形式.glm模型常用函数.常用连接函数.逻辑回归.泊松回归.系数解读.过散度分析 目录

  10. R语言使用fs包的file_info函数查看文件元信息(属性信息)、使用file_chmod函数修改文件的权限、使用file_chown函数修改文件的所有者

    R语言使用fs包的file_info函数查看文件元信息(属性信息).使用file_chmod函数修改文件的权限.使用file_chown函数修改文件的所有者 目录

最新文章

  1. iptables+geoip来过滤阻挡来源IP
  2. 【Python】卸载完Python3 之后 Python2 无法打开IDLE
  3. oracle查询当前归档scn_【学习笔记】Oracle数据库 查看归档日志存放的位置
  4. stm32 gpio口的工作模式
  5. Let's do our own full blown HTTP server with Netty--转载
  6. 面向对象编程 object oriented programming(OOP)(第二篇)
  7. wpf 切换搜狗输入法英文_搜狗输入法全新升级手写功能,中英数字自由写,告别切换丨本周新闻...
  8. @value 默认值为null_JAVA8之妙用Optional解决判断Null为空的问题
  9. Java中的数组和List
  10. memset 和 fill 初始化数组
  11. 发送带嵌入图片邮件之SMTP实现和ESMTP实现
  12. win10出现的异常解决
  13. 饥荒怎么把离线服务器改成在线,饥荒联机版专服简易启动教程
  14. Windows 7下手动搭建Asp和PHP集成环境
  15. 长连接、短连接和心跳(有图有案例)
  16. 实例讲解微信小程序倒计时功能
  17. 网络嗅探器(影音神探) v4.63 绿色正式版
  18. 二叉树线索化示意图_二叉树线索化
  19. 仿百度贴吧回帖功能分析及代码示例
  20. 【线段树】【cogs775】山海经

热门文章

  1. java parcelable_Parcelable最强解析
  2. python简单代码演示效果-python制作演示动画
  3. 蓝桥杯:小明用积木搭了一个城堡(积木)
  4. CAD图库,别墅设计图纸免费资源分享
  5. 【APK反编译】漏了个大洞获取资源文件+APK文件的获取、反编译使用方法、下载链接
  6. 计算机网络知识的PPT,计算机网络基础理论知识.ppt
  7. 大学计算机思维编程题及答案,学编程必看:10道逻辑思维测试题(附答案)
  8. 【转】解决win7资源管理器已停止工作问题
  9. Preisach模型
  10. 60周年国庆阅兵天气预测解密: “消云减雨”三道防线 数千火箭弹随时待命