qsort函数详解

大家好,我是苏貝,本篇博客带大家了解qsort函数,如果你觉得我写的不错的话,可以给我一个赞👍吗,感谢❤️
在这里插入图片描述

文章目录

  • 一. qsort函数参数详解
    • 1.数组首元素地址base
    • 2.数组的元素个数num和元素所占内存空间大小width
    • 3.自定义比较函数cmp
  • 二. cmp函数:
    • 1. 对整型数组排序(char/short/int/long)
    • 2 .对浮点型数组排序(float/double)
    • 3.对字符串长度和大小排序
      • 3.1 对字符串长度排序
      • 3.2 对字符串大小排序
    • 4.对结构体排序

一. qsort函数参数详解


函数原型:void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
头文件:<stdlib.h>
返回值:无

在这里插入图片描述

1.数组首元素地址base

如果想将一组数据进行排序,那么就要知道该数组首元素地址。base的类型为void* ,代表base可以是任意类型的指针(地址),也就是说数组可以是任意类型的。比如base的类型为int * ,代表该数组的类型为int;base的类型为double * ,代表该数组的类型为double

2.数组的元素个数num和元素所占内存空间大小width

如果想将一组数据进行排序,要知道该数组首元素地址和最后一个元素的地址,但最后一个元素地址不方便作为参数,所以要知道数组的元素个数num和一个元素所占内存空间大小width。size_t是无符号整型

3.自定义比较函数cmp

cmp原型:int cmp(const void *a, const void *b ) ;
a,b的类型为void * 也代表它们可以是任意类型的变量

注意:
1.不管a,b是何种类型的变量,cmp返回值的类型永远是int
2.,* a和 *b前都要加const,确保 *a和 *b的值不会被改变

如果想了解const,请点击该链接


二. cmp函数:

先将a和b强制类型转换为数组的类型,如数组的类型为int,那么将a和b强制类型转换为int* 类型;如数组的类型为double,那么将a和b强制类型转换为double* 类型。再让指针变量pa和pb分别指向a和b指向的内容。用num1和num2分别存储pa和pb指向的内容。返回一个值(注意:对于不同的类型,return后面的表达式也不尽相同)

1. 对整型数组排序(char/short/int/long)

int cmp(const void* a, const void* b)
{int* pa = (int*)a;int* pb = (int*)b;int num1 = *pa;int num2 = *pb;return num1 - num2;//升序//return num2 - num1;//降序
}

可以简写为:

int cmp(const void* a, const void* b)
{return *(int*)a - *(int*)b;//升序//return *(int*)b - *(int*)a;//降序
}

字符在内存中存储的是字符的ASCII码值,ASCII码是整型,所以char的写法同int

int cmp(const void* a, const void* b)
{return *(char*)a - *(char*)b;//升序//return *(char*)b - *(char*)a;//降序
}int main()
{char arr[6] = { '1','3','4','2','8','6'};qsort(arr, 6, sizeof(char), cmp);int i = 0;for (i = 0; i < 6; i++)printf("%c\n", arr[i]);return 0;
}

2 .对浮点型数组排序(float/double)

cmp的返回值类型为int,若数组为double,如果用return (int)(* (char*)a - * (char*)b); ,小数会被丢失造成结果不准确,所以用下面的判断返回值

int cmp(const void* a, const void* b)
{return *(double*)a > *(double*)b ? 1 : -1;//升序//return *(double*)a < *(double*)b ? 1 : -1;//降序
}

3.对字符串长度和大小排序

3.1 对字符串长度排序

int cmp(const void* a, const void* b)
{return strlen((char*)a) - strlen((char*)b);//升序//return strlen((char*)b) - strlen((char*)a);//降序
}int main()
{char arr[3][20] = { "hello world","yes,sir","dian ge zan ba" };qsort(arr[0], 3, sizeof(arr[0]), cmp);int i = 0;for (i = 0; i < 3; i++)printf("%s\n", arr[i]);return 0;
}

在这里插入图片描述

3.2 对字符串大小排序

int cmp(const void* a, const void* b)
{return strcmp((char*)a,(char*)b);
}int main()
{char arr[3][20] = { "hello world","yes,sir","dian ge zan ba" };qsort(arr[0], 3, sizeof(arr[0]), cmp);int i = 0;for (i = 0; i < 3; i++)printf("%s\n", arr[i]);return 0;
}

在这里插入图片描述


4.对结构体排序

对下面结构体数据中的语文成绩进行降序排序

typedef struct a
{char name[20];int Chinese;int Math;int English;
}student;int cmp(const void* a, const void* b)
{student* pa = (student*)a;student* pb = (student*)b;int num1 = pa->Chinese;int num2 = pb->Chinese;//return num1 - num2;//升序return num2 - num1;//降序
}int main()
{student stu[4] = { {"zhang",66,77,88},{"lisi",60,70,80},{"wangwu",73,76,98},{"xuer",88,89,95}};qsort(stu, 4, sizeof(student), cmp);int i = 0;for (i = 0; i < 4; i++){printf("%s\t", stu[i].name);printf("%d\t", stu[i].Chinese);printf("%d\t", stu[i].Math);printf("%d\n", stu[i].English);}return 0;
}

在这里插入图片描述


好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/43693.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT设置widget背景图片

首先说方法&#xff0c;在给widget或者frame或者其他任何类型的控件添加背景图时&#xff0c;在样式表中加入如下代码&#xff0c;指定某个控件&#xff0c;设置其背景。 类名 # 控件名 { 填充方式&#xff1a;图片路径 } 例如&#xff1a; QWidget#Widget {border-image: url…

无涯教程-TensorFlow - 优化器

Optimizers是扩展类&#xff0c;其中包括用于训练特定模型的附加信息&#xff0c;Optimizers类使用给定的参数初始化&#xff0c;用于提高速度和性能&#xff0c;以训练特定模型。 TensorFlow的基本Optimizers是- tf.train.Optimizer 此类在tensorflow/python/training/opti…

C语言:深度学习知识储备

目录 数据类型 每种类型的大小是多少呢&#xff1f; 变量 变量的命名&#xff1a; 变量的分类&#xff1a; 变量的作用域和生命周期 作用域&#xff1a; 生命周期&#xff1a; 常量 字符串转义字符注释 字符串&#xff1a; 转义字符 操作符&#xff1a; 算术操作符…

图神经网络 day2 图的分类

图神经网络基础算法 1 GCN2 GraphSAGE2.1 采样&#xff1a;采样固定长度的邻居2.2 聚合2.3 GraphSAGE_minibatch2.4 GraphSAGE_embedding 3 GAT4. 图网络的分类4.1 递归图神经网络 RGNN4.2 图卷积神经网络GCN4.3 图注意力网络 GAT4.4 图自动编码 GAE4.5 图时空网络 GSTN4.6 图生…

OSPF在广播类型的网络拓扑中DR和BDR的选举

指定路由器&#xff08;DR&#xff09;&#xff1a; 一个网段上的其他路由器都和指定路由器&#xff08;DR&#xff09;构成邻接关系&#xff0c;而不是它们互相之间构成邻接关系。 备份指定路由器&#xff08;BDR&#xff09;&#xff1a; 当DR出现问题&#xff0c;由BDR接…

redis事务对比Lua脚本区别是什么

redis官方对于lua脚本的解释&#xff1a;Redis使用同一个Lua解释器来执行所有命令&#xff0c;同时&#xff0c;Redis保证以一种原子性的方式来执行脚本&#xff1a;当lua脚本在执行的时候&#xff0c;不会有其他脚本和命令同时执行&#xff0c;这种语义类似于 MULTI/EXEC。从别…

Python web实战之Django 的跨站点请求伪造(CSRF)保护详解

关键词&#xff1a;Python、Web、Django、跨站请求伪造、CSRF 大家好&#xff0c;今天我将分享web关于安全的话题&#xff1a;Django 的跨站点请求伪造&#xff08;CSRF&#xff09;保护&#xff0c;介绍 CSRF 的概念、原理和保护方法. 1. CSRF 是什么&#xff1f; CSRF&#…

微服务与Nacos概述-6

RBAC 模型 RBAC 基于角色的访问控制是实施面向企业安全策略的一种有效的访问控制方式。 基本思想是&#xff0c;对系统操作的各种权限不是直接授予具体的用户&#xff0c;而是在用户集合与权限集合之间建立一个角色集合。每一种角色对应一组相应的权限。一旦用户被分配了适当…

【AIGC】 快速体验Stable Diffusion

快速体验Stable Diffusion 引言一、安装二、简单使用2.1 一句话文生图2.2 详细文生图 三、进阶使用 引言 stable Diffusion是一款高性能的AI绘画生成工具&#xff0c;相比之前的AI绘画工具&#xff0c;它生成的图像质量更高、运行速度更快&#xff0c;是AI图像生成领域的里程碑…

【100天精通python】Day41:python网络爬虫开发_爬虫基础入门

目录 专栏导读 1网络爬虫概述 1.1 工作原理 1.2 应用场景 1.3 爬虫策略 1.4 爬虫的挑战 2 网络爬虫开发 2.1 通用的网络爬虫基本流程 2.2 网络爬虫的常用技术 2.3 网络爬虫常用的第三方库 3 简单爬虫示例 专栏导读 专栏订阅地址&#xff1a;https://blog.csdn.net/…

【玩转Linux操作】crond的基本操作

&#x1f38a;专栏【玩转Linux操作】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f354;概述&#x1f354;命令⭐常用选项 &#x1f354;练…

【微服务】一文了解 Nacos

一文了解 Nacos Nacos 在阿里巴巴起源于 2008 2008 2008 年五彩石项目&#xff08;完成微服务拆分和业务中台建设&#xff09;&#xff0c;成长于十年双十一的洪峰考验&#xff0c;沉淀了简单易用、稳定可靠、性能卓越的核心竞争力。 随着云计算兴起&#xff0c; 2018 2018 20…

编程练习(3)

一.选择题 第一题&#xff1a; 函数传参的两个变量都是传的地址&#xff0c;而数组名c本身就是地址&#xff0c;int型变量b需要使用&符号&#xff0c;因此答案为A 第二题&#xff1a; 本题考察const修饰指针变量&#xff0c;答案为A,B,C,D 第三题&#xff1a; 注意int 型变…

13---内嵌HTML和React

虽然Markdown本身不支持内嵌HTML和React&#xff0c;但可以在Markdown文档中直接插入HTML代码和React组件。 一、在markdown中内嵌HTML 在Markdown中&#xff0c;你可以使用HTML标签来实现更复杂的样式和布局。例如&#xff0c;你可以使用<div>标签来创建一个容器&#…

算法与数据结构(五)--树与二叉查找树

符号表的增删查操作&#xff0c;随着元素个数N的增多&#xff0c;其耗时也是线性增多的&#xff0c;时间复杂度都是O(n)&#xff0c;为了提高运算效率&#xff0c;我们学习树这种数据结构。 目录 一.树的基本定义 二.树的相关术语 三.二叉树的基本定义 四.二叉树的链表实现…

leetcode 279. 完全平方数

2023.8.18 与零钱兑换相似&#xff0c;本题属于完全背包问题&#xff1a;完全平方数为物品&#xff0c;整数n为背包。 直接上代码&#xff1a; class Solution { public:int numSquares(int n) {vector<int> dp(n1 , INT_MAX);dp[0] 0;for(int i1; i*i<n; i){for(in…

时序预测 | MATLAB实现WOA-CNN-BiGRU鲸鱼算法优化卷积双向门控循环单元时间序列预测

时序预测 | MATLAB实现WOA-CNN-BiGRU鲸鱼算法优化卷积双向门控循环单元时间序列预测 目录 时序预测 | MATLAB实现WOA-CNN-BiGRU鲸鱼算法优化卷积双向门控循环单元时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 时序预测 | MATLAB实现WOA-CNN-BiGRU鲸…

干翻Dubbo系列第十二篇:Dubbo协议介绍

文章目录 文章说明 一&#xff1a;Dubbo协议 1&#xff1a;Dubbo协议简介 2&#xff1a;Dubbo协议优点 3&#xff1a;Dubbo协议帧的组成 (一)&#xff1a;幻数 (二)&#xff1a;2Way (三)&#xff1a;event (四)&#xff1a;Serilization ID (五)&#xff1a;status …

每日一题 142环形链表||(快慢指针)

题目 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部…

深入理解【二叉树】

&#x1f4d9;作者简介&#xff1a; 清水加冰&#xff0c;目前大二在读&#xff0c;正在学习C/C、Python、操作系统、数据库等。 &#x1f4d8;相关专栏&#xff1a;C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…