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;
}

在这里插入图片描述


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构OJ题】设计循环队列

原题链接&#xff1a;https://leetcode.cn/problems/design-circular-queue/ 1. 题目描述 2. 循环队列的概念和结构 为充分利用向量空间&#xff0c;克服"假溢出"现象的方法是&#xff1a;将向量空间想象为一个首尾相接的圆环&#xff0c;并称这种向量为循环向量。…

【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/…

OLED透明屏采购指南:如何选择高质量产品?

着科技的不断进步&#xff0c;OLED透明屏作为一种创新的显示技术&#xff0c;在各个行业中得到了广泛应用。 在进行OLED透明屏采购时&#xff0c;选择高质量的产品至关重要。在这篇文章中&#xff0c;尼伽将为您提供一个全面的OLED透明屏采购指南&#xff0c;帮助您了解关键步…

4.物联网LWIP之C/S编程

LWIP配置 服务器端实现 客户端实现 错误分析 一。LWIP配置&#xff08;FREERTOS配置&#xff0c;ETH配置&#xff0c;LWIP配置&#xff09; 1.FREERTOS配置 为什么要修改定时源为Tim1&#xff1f;不用systick&#xff1f; 原因&#xff1a;HAL库与FREERTOS都需要使用systi…

【力扣每日一题】2023.8.15 字符中的查找与替换

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目很长&#xff0c;简而言之就是检查字符串中对应索引的位置是否有特定的字符串&#xff0c;如果有&#xff0c;那么替换&#xff0c;返…

【Unity每日一记】关于五种范围检测方法的总结

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

==和equals方法之间的区别,hashcode的理解,String拼接,Spring拆分

==和equals方法之间的区别 字符串有字符串常量池的概念,本身就推荐使用String s="字符串", 这种形式来创建字符串对象, 而不是通过new关键字的方式, 因为可以把字符串缓存在字符串常量池中,方便下次使用,不用遇到new就在堆上开辟一块新的空间 有一对双胞胎姐妹,晓苑…

CVE-2015-5254漏洞复现

1.漏洞介绍。 Apache ActiveMQ 是美国阿帕奇&#xff08;Apache&#xff09;软件基金会所研发的一套开源的消息中间件&#xff0c;它支持 Java 消息服务&#xff0c;集群&#xff0c;Spring Framework 等。Apache ActiveMQ 5.13.0之前 5.x 版本中存在安全漏洞&#xff0c;该漏…

Java 集合详解

目录 1.集合体系结构 2.Collection集合 2.1 Collection集合 2.1.1 Collection基本方法 2.1.2 Collection遍历方式 2.1.2.1 迭代器遍历 2.1.2.2 增强for循环 2.1.2.3 Lambda表达式 3.List集合 3.1 List集合的基本方法 3.2 List集合的遍历方式 4.数据结构 4.1 数据结…

【C++11新特性】lambda表达式

文章目录 1. lambda表达式概念2. lambda表达式语法3. lambda表达式应用 1. lambda表达式概念 lambda表达式是一个匿名函数&#xff0c;恰当使用lambda表达式可以让代码变得简洁&#xff0c;并且可以提高代码的可读性。 见见lambda表达式的使用 现在要对若干商品分别按照价格和…

Maven之mirrorof范围

mirrorOf 是 central 还是 * 的问题 在配置阿里对官方中央仓库的镜像服务器时&#xff0c;我们使用到了 <mirror> 元素。 <mirror><id>aliyunmaven</id><mirrorOf>central</mirrorOf><name>阿里云公共仓库</name><url>…

File 类的用法, InputStream和Reader, OutputStream和Writer 的用法

前言 普通的文件长这样&#xff1a; 其实目录也是一种特殊文件&#xff1a; 一、文件前缀知识 &#xff08;一&#xff09;绝对路径和相对路径 以盘符开头的的路径&#xff0c;叫做绝对路径&#xff0c;如&#xff1a;D:\360Downloads\cat.jpg 以.或..开头的路径&#xff0c…

uni-app的Vue.js实现微信小程序的紧急事件登记页面功能

主要功能实现 完成发生时间选择功能&#xff0c;用户可以通过日期选择器选择事件发生的时间。实现事件类型选择功能&#xff0c;用户可以通过下拉选择框选择事件的类型。添加子养殖场编号输入框&#xff0c;用户可以输入与事件相关的子养殖场编号。完成事件描述输入功能&#…

PSP - 基于扩散生成模型预测蛋白质结构 EigenFold 算法与环境配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132357976 Paper: EigenFold: Generative Protein Structure Prediction with Diffusion Models EigenFold 是用于蛋白质结构预测的扩散生成模型…

Python自动化实战之使用Selenium进行Web自动化详解

概要 为了完成一项重复的任务&#xff0c;你需要在网站上进行大量的点击和操作&#xff0c;每次都要浪费大量的时间和精力。Python的Selenium库就可以自动化完成这些任务。 在本篇文章中&#xff0c;我们将会介绍如何使用Python的Selenium库进行Web自动化&#xff0c;以及如何…

AlexNet阅读笔记

ImageNet classification with deep convolutional neural networks 原文链接&#xff1a;https://dl.acm.org/doi/abs/10.1145/3065386 中文翻译&#xff1a;https://blog.csdn.net/qq_38473254/article/details/132307508 使用深度卷积神经网络进行 ImageNet 分类 摘要 大…

【数据结构】如何用队列实现栈?图文详解(LeetCode)

LeetCode链接&#xff1a;225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 本文默认读者已经掌握栈与队列的基本知识 或者先看我的另一篇博客&#xff1a;【数据结构】栈与队列_字节连结的博客-CSDN博客 做题思路 由于我们使用的是C语言&#xff0c;不能直接使用队…

ubuntu 部署 ChatGLM-6B 完整流程 模型量化 Nvidia

ubuntu 部署 ChatGLM-6B 完整流程 模型量化 Nvidia 初环境与设备环境准备克隆模型代码部署 ChatGLM-6B完整代码 ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;具有 62 亿参数。结合模型量化技术&#x…

Python入门【装饰器​编辑、多个装饰器 、带参数的装饰器、生成器、 生成器定义、 迭代器】(二十八)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…