C语言-qsort函数基本使用

news2024/11/15 9:04:33

个人主页:平行线也会相交
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【C/C++】
在这里插入图片描述

先来看一下qsort函数的介绍:

在这里插入图片描述
在这里插入图片描述

Compare 函数的返回值描述
>0elem1将被排在elem2前面
0elem1等于elem2
<0elem1 将被排在elem2后面

参数

  • base-- 指向要排序的数组的第一个元素的指针。
  • nitems-- 由 base 指向的数组中元素的个数。
  • size-- 数组中每个元素的大小,以字节为单位。
  • compar-- 用来比较两个元素的函数,即函数指针(回调函数)

compar参数

compar参数指向一个比较两个元素的函数。比较函数的原型应该像下面这样。注意两个形参必须是const void
*型,同时在调用compar 函数(compar实质为函数指针,这里称它所指向的函数也为compar)时,传入的实参也必须转换成const void *型。在compar函数内部会将const void *型转换成实际类型。

排序整型数组


```c
#include <stdio.h>
#include <stdlib.h>

int cmp_int(const void* num1,const void* num2)
{
	int* pa = (int*)num1;
	int* pb = (int*)num2;
	return *pa - *pb;
}

int main()
{
	int arr[5] = { 2,3,1,6,5 };
	qsort(arr, 5, sizeof(arr[0]), cmp_int);
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

在这里插入图片描述
想要从大到小的话,把return *pa - *pb;倒过来即可,即return *pb - *pa;

排序浮点型数组

int cmp_int(const void* num1, const void* num2)
{
	float* pa = (float*)num1;
	float* pb = (float*)num2;
	return *pa > *pb ? 1 : -1;
}

int main()
{
	float arr[6] = { 2,3,1,6,5,5 };
	qsort(arr, 6, sizeof(float), cmp_int);
	int i = 0;
	for (i = 0; i < 6; i++)
	{
		printf("%f ", arr[i]);
	}
	return 0;
}

在这里插入图片描述

排序结构体

//按语文成绩排序
typedef struct
{
	char name[10];
	int Chinese;
	int Math;
	int English;
}Student;

Student students[7];

void readData()//读入学生数据
{
	FILE* file = fopen("mark.txt", "r");
	int i = 0;
	for (i = 0; i < 7; i++)
	{
		fscanf(file, "%s", students[i].name);
		fscanf(file, "%d", &students[i].Chinese);
		fscanf(file, "%d", &students[i].Math);
		fscanf(file, "%d", &students[i].English);
	}
	fclose(file);
	file = NULL;
}

void DisPlayData()
{
	int i = 0;
	for (i = 0; i < 7; i++)
	{
		printf("%s\t", students[i].name);
		printf("%d\t", students[i].Chinese);
		printf("%d\t", students[i].Math);
		printf("%d\n", students[i].English);
	}
}

int cmp(const void* num1, const void* num2)
{
	Student* pa = (Student*)num1;
	Student* pb = (Student*)num2;
	int num3 = pa->Chinese;
	int num4 = pb->Chinese;
	return num3 - num4;
}

int main()
{
	readData();
	qsort(students, 7, sizeof(Student), cmp);
	DisPlayData();
	return 0;
}

按总分数排序

typedef struct
{
	char name[10];
	int Chinese;
	int Math;
	int English;
}Student;

Student students[7];

void readData()//读入学生数据
{
	FILE* file = fopen("mark.txt", "r");
	int i = 0;
	for (i = 0; i < 7; i++)
	{
		fscanf(file, "%s", students[i].name);
		fscanf(file, "%d", &students[i].Chinese);
		fscanf(file, "%d", &students[i].Math);
		fscanf(file, "%d", &students[i].English);
	}
	fclose(file);
	file = NULL;
}

void DisPlayData()
{
	int i = 0;
	for (i = 0; i < 7; i++)
	{
		printf("%s\t", students[i].name);
		printf("%d\t", students[i].Chinese);
		printf("%d\t", students[i].Math);
		printf("%d\t", students[i].English);
		printf("%d\n", students[i].Chinese + students[i].Math + students[i].English);
	}
}

int cmp(const void* a, const void* b)
{
	Student* pa = (Student*)a;
	Student* pb = (Student*)b;
	int num3 = pa->Chinese+pa->English+pa->Math;
	int num4 = pb->Chinese+pb->Chinese+pb->Math;
	return num3 - num4;
}

int main()
{
	readData();
	qsort(students, 7, sizeof(Student), cmp);
	DisPlayData();
	return 0;
}

在这里插入图片描述
以上就是qsort函数基本的使用方式。
就到这里。
在这里插入图片描述

再见啦!!!

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

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

相关文章

LeetCode刷题模版:171-174、179

目录 简介171. Excel 表列序号172. 阶乘后的零173. 二叉搜索树迭代器174. 地下城游戏【未理解】179. 最大数结语简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,…

Redis学习【1】之Nosql概述

文章目录一 从技术发展探究使用Nosql的原因1.1 单机Mysql时代1.2 Memcached&#xff08;缓存&#xff09; MySQL 垂直拆分[读写分离]1.3 MySQL主从读写分离1.4 分表分库 水平拆分 Mysql 集群1.5 如今时代1.6 使用NoSQL的原因二 Nosql初识2.1 NoSQL的特点【解耦】三 NoSQL的四…

树状数组的原理和区间和

目录 一、前言 二、树状数组的原理 1、杂论 2、从二叉树到树状数组 3、神奇的 lowbit(x) 操作 4、tree[ ]数组&#xff1a;将一维信息转换为树形信息存储 5、基于 tree[ ] 的计算 6、tree[]的更新&#xff08;要加lowbit&#xff09; 三、树状数组的应用 1、单点修改…

流媒体方案之Nginx

1.Nginx可以作为流体服务器。2三种web服务器的比较3.推流端: FFmpeg使用RTMP协议向Nginx推流拉流端: •VLC播放器使用RTMP或HTTPFLV协议从Nginx拉流•浏览器使用HTTPFLV协议从Nginx拉流(安装flv.js)4.有两种方法&#xff1a;下载源码&#xff0c;手工编译使用Buildroot&#xf…

Redis分布式锁 | 黑马点评

目录 一、分布式锁概述 二、基于Redis的分布式锁 1、思路分析 2、初级版本 3、误删问题 4、改进分布式锁 5、原子性问题 6、使用Lua脚本解决原子性问题 7、setnx实现分布式锁存在问题 三、Redisson 1、Redisson快速入门 2、Redisson可重入锁原理 3、Redisson可重试…

从某一点出发沿任意一方向旋转矩阵计算思考与实现

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 上期讲到 绕任一向量旋转矩阵计算思考与实现 点击前往 点击前往 问题提出 之前讲到绕任一向量旋转矩阵实现&#xff0c;原来的向量都是从原点出发&#xff0c;现在把…

Ajax面试题目

更多Ajax面试题目可以查看专栏内容 1.AJAX应用和传统Web应用有什么不同&#xff1f; 传统的web前端与后端的交互中&#xff0c;浏览器直接访问Tomcat的Servlet来获取数据。Servlet通过转发把数据发送给浏览器。当我们使用AJAX之后&#xff0c;浏览器是先把请求发送到XMLHttpR…

Swift之struct二进制大小分析

随着Swift的日渐成熟和给开发过程带来的便利性及安全性&#xff0c;京喜App中的原生业务模块和基础模块使用Swift开发占比逐渐增高。本次讨论的是struct对比Class的一些优劣势&#xff0c;重点分析对包体积带来的影响及规避措施。 一、基础知识 1、类型对比 引用类型&#xff…

独立看门狗与窗口看门狗

定义 看门狗的本质是一个定时器&#xff0c;在启动后&#xff0c;需要在一定时间内再给它一个信号&#xff0c;俗称“喂狗”&#xff0c;如果没有按时“喂狗”&#xff0c;说明MCU可能处于非正常状态&#xff0c;这时看门狗就向MCU发送个复位信号&#xff0c;使整个系统重启&a…

51单片机数码管显示

文章目录前言一、数码管简介二、数码管原理图三、数码管显示原理四、静态数码管代表编写五、动态数码管总结前言 这篇文章将介绍数码管的显示其中包含了动态数码管和静态数码管两种。 一、数码管简介 数码管其实就是由多个发光二极管封装在一起组成“8”字型的器件当分别点亮…

【数据结构】超详细——堆的实现

一、堆的概念及性质 1.1 什么是堆&#xff1f; 堆是一种完全二叉树&#xff08;具体在下一章讲述&#xff09;&#xff0c;若二叉树的深度h&#xff0c;除了第h层外其余各层节点数满了&#xff0c;只有第h层缺额且该层结点靠左&#xff1b;任何一个数组可以看作完全二叉树&…

【14】C语言_函数简介

目录 1、C语言中函数的分类: 2、库函数 3、自定义函数 1、C语言中函数的分类: 1.库函数 2.自定义函数 2、库函数 为什么会有库函数? 1.我们知道在我们学习C语言编程的时候&#xff0c;总是在一个代码编写完成之后迫不及待的想知道结果&#xff0c;想把这个结果打印到我们的屏…

ESP32设备驱动-LX1972可见光传感器驱动

LX1972可见光传感器驱动 1、LX1972介绍 LX1972 是一款低成本硅光传感器,其光谱响应非常接近人眼。专利电路在 520nm 处产生峰值光谱响应,IR 响应小于峰值响应的 5%,高于 900nm。 光电传感器是一个 PIN 二极管阵列,具有线性、准确和非常可重复的电流传递函数。 芯片上的…

扫盲-从零开始搭建阿里云流媒体服务器/音视频编解码/

1.基础概念 2.简单模式-HTTP文件服务器 存储采用NAS&#xff0c;服务器配置 采用FASTDFS (192条消息) Linux新手入门系列&#xff1a;FastDFS单机部署一键安装脚本_IT小胖豆的博客-CSDN博客 有几个坑&#xff1a; 常用命令&#xff1a; tail -20f /usr/local/nginx/logs/er…

3小时精通opencv(三)图片裁剪与形状绘制

3小时精通opencv(三)图片裁剪与形状绘制 参考视频资源:3h精通Opencv-Python 文章目录3小时精通opencv(三)图片裁剪与形状绘制图片裁剪绘制形状绘制直线绘制矩形绘制圆形绘制文字整体代码图片裁剪 图片裁剪不需要使用opencv中特有的函数, 对于opencv中读取到的图像, 直接当做矩…

15. python数据类型转换

1. 隐式类型转换 - 自动完成 在隐式类型转换中&#xff0c;Python 会自动将一种数据类型转换为另一种数据类型&#xff0c;不需要我们去干预。 (1) 以下实例中&#xff0c;我们对两种不同类型的数据进行运算&#xff0c;较低数据类型&#xff08;整数&#xff09;就会转换为较…

java 探花交友项目day4 MongoDB

数据库表 接口定义 其他都比较简单 我们讲黑名单查询页面的设计 DubboService public class BlackListApiImpl extends ServiceImpl<BlackListMapper,BlackList> implements BlackListApi{Autowiredprivate BlackListMapper blackListMapper;Autowiredprivate UserInf…

Allegro如何输出坐标文件操作指导

Allegro如何输出坐标文件操作指导 PCB在SMT的时候会需要用坐标文件,Allegro支持输出坐标文件,如下图 具体操作如下 选择Tools选择report出现repor

LINUX学习之正则表达式(十二)

普通正则 元字符 元字符匹配描述.匹配除了换行符以外的任意单个字符*前导字符出现0次或连续多次.*任意长度字符^行首(以…开头)$行尾(以…结尾)^$空行[]匹配括号里任意单个字符或一组单个字符[^]匹配不包含括号里任一单个字符或一组单个字符^[]匹配以括号里任意单个字符或一组…

Python技能树-推导式

Python 列表推导式(1) Python 独步天下的推导式表达式&#xff0c;使用列表推导式过滤出偶数列表 # -*- coding: UTF-8 -*- if __name__ __main__:list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]print()print("# 使用列表推导式过滤出偶数")# TODO(you): 请在此实现过滤代…