C语言-qosrt函数—秩序大师

news/2024/9/18 13:20:14/ 标签: c语言, 数据结构, 开发语言

1、qsort()的作用

在我们的日常生活中,排序无处不在。想象一下,当你整理书架时,会按照书籍的类别、作者或者大小进行排列,让你的阅读空间更加整洁有序。又比如,在超市的货架上,商品通常也是按照一定的规则进行排序,方便顾客快速找到所需物品。在学校里,老师可能会根据学生的成绩进行排名,以了解学生的学习情况。

而在计算机编程的世界里,同样需要对数据进行高效的排序。这时,qsort 函数就如同一位强大的秩序之师,挺身而出。qsort 函数是 C 语言标准库中的快速排序函数它能够快速而有效地对各种数据进行排序。无论是简单的整数数组,还是复杂的结构体数组,qsort 函数都能轻松应对。它以其高效的性能和灵活的用法,成为了程序员们在处理数据排序问题时的得力助手。

说了这么多,接下来我们也该来见一见这位秩序大师的庐山真面目了!

2、qsort函数的基本信息

在cplusplus(C语言函数查询网站)上,我们可以看到qsort函数的函数原型

eb4f368f71f443cba37f527e5159ca93.png

qsort函数是有4个变量的,分别是base,num,size,comper

他们的类型分别是void*;size_t;size_t;int(*)(const void*,const void*);

cplusplus上对这四个变量的解释:(下图为机翻,因此可能会有些不准确)

33016d7eece44e29a4237b64a4727c2e.png

对上面的参数解释的理解:

  • base:base中存放的是待排序数组的第一个元素的地址
  • num:num存放的是base指向的数组的元素个数
  • size:size是base指向的数组中一个元素的长度(以字节为单位)。
  • comper:函数指针—指向了一个比较函数,这个比较函数用来比较数组中的两个元素的大小

int(*)(const void* e1,const void* e2)中:

如果e1指向的元素大于e2指向的元素,那么函数返回>0的数字

如果e1指向的元素等于e2指向的元素,那么函数返回0

如果e1指向的元素小于e2指向的元素,那么函数返回<0的数字

3、qsort函数变量的详细介绍

1.void*base

base中存放的是待排序数组的第一个元素的地址

关于base的作用就是为了寻找到待排序的数组的地址,这里为什么使用void*指针呢?

void*指针,可以接收任意类型变量的地址。所以,这里我们使用void*指针来修饰base的目的是为了能够接收任意类型的数组。微软公司在创造这个函数的时候,是不知道使用者将要排序什么类型的数组,所以需要使用void*来修饰。

2.size_t num

num存放的是base指向的数组的元素个数

不管是冒泡排序,还是快速排序,我们都需要知道所要排序的元素个数,这个参数很好理解。

3.size_t size

size:size是base指向的数组中一个元素的长度(以字节为单位)

可能有些人很疑惑,为什么还需要知道数组中一个元素的长度呢?

这是由于base的数据类型是void*

如果我们是int*的话,向后看到的就是整型数组,如果我们是char*的话,向后看到的就是字符数组。但是我们使用的是void*指针,所以我们不知道数组中的元素的具体类型,所以我们需要传递

数组中一个元素的长度,如果排序的是整型的话,一个元素长度是4个字节,如果排序的字符类型的话,一个元素长度是1个字节。

如果没有size参数,给你一个空间,访问十个元素,那么访问一个元素的长度是多大呢?访问十个元素所要占的长度是多少呢?

c431f53a728f4d72a6c4648a9e1a883b.png

这就像是在路边询问路线,您需要到达一个地方。有人告诉您向前走十步就能到达,但他们没有说明一步应该走多远。或许他们每步迈的幅度较大,而您迈的幅度较小。因此,当您走了十步之后,可能会发现并没有到达目的地。

我们既需要知道访问多少个元素,也需要知道访问一个元素的长度才能够更加准确的访问空间。

4.int(*comper)(const void*,const void*)

先来分析一下int(*)(const void*,const void*)

首先,该参数是一个函数指针,它指向一个有两个无类型指针作为参数的函数,并且该函数的返回值是int类型的。

该函数指针的作用是将两个无类型指针指向的参数进行比较,如果参数1小于参数2返回小于0的整数,如果参数1等于参数2,返回0,如果参数1大于参数2,返回大于0的整数。

comper()函数的作用仅仅是比较两个参数的大小,并且通过返回值来告诉我们比较的结果,但是所比较的两个数是不能修改的。使用const修饰。

注意:使用qsort函数排序默认是升序

当我们得到的返回值>0的值时,qsort函数将会将这两个数字交换,当得到的返回值<0的值时,qsort函数将不会对其进行交换。

4、使用qsort函数排序整型数组,结构体数组

当我们了解了qsort函数的一些基础知识后,可以使用qsort函数来完成一些数据的排序;

4.1 使用qsort函数来排序整型数组:

#include <stdio.h>
#include <stdlib.h>
int cmp_int(const void* e1, const void* e2)
{return *(int*)e1 - *(int*)e2;//通过相减来直接获得返回值的大小
}
void print_arr(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");
}
void test1()
{int arr[10] = { 3,2,5,7,4,9,0,1,8,6 };//所排数组int sz = sizeof(arr) / sizeof(arr[0]);//元素个数qsort(arr, sz, sizeof(arr[0]), cmp_int);//qsort函数参数的传递print_arr(arr, sz);
}
int main()
{test1();
}

return *(int*)e1 - *(int*)e2这里通过相减可以直接获得返回值,如果e1>e2,返回>0的数,如果e1<e2, 返回<0的数,因此,使用qsort函数排序默认为升序,如果想要排逆序,只需要交换e1和e2的位置即可。

4.2 使用qsort函数来排序结构体数组:

//创建结构体变量
struct Stu
{char name[20];//人名int age;//年龄
};
void test2()
{struct Stu s[3] = { {"zhangsan",18},{"lisi",25},{"wangwu",20} };//创建结构体数组int sz = sizeof(s) / sizeof(s[0]);//获得数组元素个数qsort(s, sz, sizeof(s[0]), cmp_stu);}
int main()
{test2();
}

 当开始调用函数cmp_stu来比较结构体数组时,这时候就会产生疑问,该按照什么来比较结构体大小,是按照名字字母顺序来比较?还是按照年龄来比较?

4.2.1 按照年龄来排序结构体数组:

cmp_stu_by_age(const void* e1, const void* e2)
{return (*(struct Stu*)e1).age - (*(struct Stu*)e2).age;
}
//e1.e2分别指向两个结构体对象

 (struct Stu*)e1这是将e1的类型强制转换为struct Stu*结构体类型。

完整代码:

#include <stdio.h>
#include <stdlib.h>struct Stu
{char name[20];int age;
};
cmp_stu_by_age(const void* e1, const void* e2)
{return (*(struct Stu*)e1).age - (*(struct Stu*)e2).age;
}
void test2()
{struct Stu s[3] = { {"zhangsan",18},{"lisi",25},{"wangwu",20} };int sz = sizeof(s) / sizeof(s[0]);qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);//qsort函数参数的传递for (int i = 0; i < 3; i++){printf("%s,%d\n", s[i].name, s[i].age);}
}
int main()
{test2();
}

dd7bb03f9fa24a72a9abe50975f81274.png

 4.2.2 按照姓名来排序结构体数组:

在比较前,我们先了解一个函数strcmp函数,该函数的作用是用来比较字符串的大小

使用格式:strcmp(字符串1,字符串2)

如果字符串1 大于 字符串2,返回大于0的数字;

如果字符串1 小于 字符串2,返回小于0的数字;

我们知道名字是字符串,所以不能直接使用>比较,因此我们通过strcmp函数来比较大小

strcmp函数的使用需要包含头文件<string.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Stu
{char name[20];int age;
};
cmp_stu_by_name(const void* e1, const void* e2)
{return strcmp((*(struct Stu*)e1).name , (*(struct Stu*)e2).name);
}
void test2()
{struct Stu s[3] = { {"zhangsan",18},{"lisi",25},{"wangwu",20} };int sz = sizeof(s) / sizeof(s[0]);qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);//qsort函数参数的传递for (int i = 0; i < 3; i++){printf("%s,%d\n", s[i].name, s[i].age);}
}
int main()
{test2();
}

 


http://www.ppmy.cn/news/1524536.html

相关文章

pytest二次开发:生成用例参数

pytest.fixture是一个装饰器&#xff0c;用于声明一个fixture。Fixture是pytest中的一个核心概念&#xff0c;它提供了一种将测试前的准备代码&#xff08;如设置测试环境、准备测试数据等&#xff09;和测试后的清理代码&#xff08;如恢复测试环境、删除临时文件等&#xff0…

jenkins工具的介绍和gitlab安装

使用方式 替代手动&#xff0c;自动化拉取、集成、构建、测试&#xff1b;是CI/CD持续集成、持续部署主流开发模式中重要工具&#xff1b;必须组件 jenkins-gitlab&#xff0c;代码公共仓库服务器&#xff08;至少6G内存&#xff09;&#xff1b;jenkins-server&#xff0c;需…

Pikachu靶场之RCE漏洞详解

一.exec "ping" 1.ping本机127.0.0.1 2.用&符拼接dir查看目录 3.&拼接echo输入一句话木马 127.0.0.1&echo "<?php eval($_POST[cmd]);?>)" > 6.php 4.同级目录访问6.php&#xff0c;蚁剑连接 二&#xff1a;exec "eval"…

Python中的`set`和`frozenset`的区别

在Python中&#xff0c;set和frozenset是两种用于存储不重复元素的数据结构&#xff0c;它们都属于集合&#xff08;Set&#xff09;类型&#xff0c;但在使用场景、功能特性和性能表现上存在一些关键的区别。 1. 基本概念 set set是Python中的一个内置数据类型&#xff0c;…

滑动窗口——优选算法

个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;游戏、数据结构、c语言基础、c学习、算法 目录 一.滑动窗口算法原理&#xff1a; 二.无重复字符的最长子串 1.题目解析​编辑 2.算法原理 3.代码编写 三.长度最小的子数组 1.题目解析 2.算法原理 3.代码编…

太能装了,国内有没有二本恋综?

9月&#xff0c;国内头部恋综IP节目《心动的信号第七季》开播。然而&#xff0c;与恋爱甜度相比&#xff0c;嘉宾们的“装”感却率先成为了舆论焦点。 事件起因为首集嘉宾初次会面时&#xff0c;为塑造精英形象太过刻意的行为举止。 其中&#xff0c;最具代表性的场景来自于&…

JDBC详细知识点和操作

javaweb的作用&#xff0c;属于中间者&#xff0c;负责逻辑处理 这三部分互相协作组成了网页 javaweb也就是这三部分 一.数据库部分&#xff08;略&#xff09; 二.javaweb程序 1.JDBC 概念&#xff1a;通过java代码操作数据库 数据库种类有很多&#xff0c;比如Oracle&a…

爬虫3:re正则表达式获取数据

在上一章中&#xff0c;我们基本上掌握了抓取整个网页的基本技能.但是呢&#xff0c;大多数情况下&#xff0c;我们并不需要整个网页的内容,只是 需要那么一小部分&#xff0c;怎么办呢&#xff1f;这就涉及到了数据提取的问题. 本课程中&#xff0c;提供三种解析方式&#xff…

【2025】基于Python的空气质量综合分析系统的设计与实现(源码+文档+调试+答疑)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

Excel如何设置不能复制里面内容?学学工作表保护功能

大家好&#xff0c;这里是效率办公指南&#xff01; &#x1f4ca; 在这个信息爆炸的时代&#xff0c;数据安全变得尤为重要。Excel文件中的数据往往包含了敏感信息&#xff0c;如何确保这些数据不被未经授权的人复制&#xff0c;成为了我们日常工作中的一个挑战。今天&#x…

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运…

uniapp+vue3实现小程序和h5解压线上压缩包以及如何访问解压后的视频地址

安装jszip插件 npm install jszip 对应功能实现和逻辑处理&#xff1a; <script setup>import { onMounted, reactive, ref } from vueimport { onHide, onUnload } from dcloudio/uni-appimport JSZip from jsziplet videoSrc ref() // 视频地址// 创建JSZip实例con…

基于 PyTorch 和 TensorFlow 的口罩检测与人脸识别系统

在后疫情时代&#xff0c;口罩检测成为了人脸识别系统的一个重要功能。如何在戴口罩的情况下准确识别身份&#xff0c;是一个技术难点。本文将介绍如何利用 PyTorch 和 TensorFlow 实现一个包含口罩检测功能的简单人脸识别系统&#xff0c;结合了Facenet 模型用于特征提取&…

南卡OE PRO2开放式耳机发布,引领开放式音频技术新革命

NANK南卡品牌作为国内的音频大牌&#xff0c;在开放式耳机领域不断的探索尝试&#xff0c;此次新上线的南卡OE Pro2开放式耳机更是集合了南卡整个品牌的多项核心技术和多年心血&#xff0c;即将成为这个领域的尖端产品&#xff0c;这也是南卡开发出新蓝海的象征&#xff0c;预示…

香港科技大学工学2025/2026年度硕士研究生(MSc)项目招生宣讲会

&#x1f514;香港科技大学工学院2025/2026年度硕士研究生&#xff08;MSc&#xff09;项目招生宣讲会 &#x1f559;时间&#xff1a;2024年9月25日&#xff08;星期三&#xff09;19:00 &#x1f3e0;地点&#xff1a;华南理工大学五山校区33号楼403室 &#x1f386;2024Ti…

GEE 案例——如何利用CHIRPS/DAILY影像数据进行时序降水数据分析?

目录 简介 数据 函数 ui.Chart.image.series(imageCollection, region, reducer, scale, xProperty) Arguments: Returns: ui.Chart 代码 结果 简介 这里我们利用2000年-2023年的CHIRPS/DAILY数据来实现降水数据的长时序分析。 数据 UCSB-CHG/CHIRPS/DAILY是一个基于…

MATLAB入门教程

MATLAB安装教程可参考链接&#xff1a;matlab怎么安装 matlab安装教程-电脑软件-PHP中文网 1.MATLAB的工作环境 &#xff08;1&#xff09;命令窗(command window) 是对MATLAB进行操作的主要载体。默认情况下&#xff0c;启动MATLAB时就打开命令窗。MATLAB的所有所数…

Peewee+Postgresql+PooledPostgresqlDatabase重连机制

需求&#xff1a; Postgresql数据库服务重启后&#xff0c;需要业务代码正常读写数据库 方案&#xff1a; 通过继承playhouse.shortcuts.ReconnectMixin和playhouse.pool.PooledPostgresqlDatabase来创建一个新的ReconnectPooledPostgresqlDatabase类修改reconnect_errors属性来…

何时空仓库

某仓库现存货物 s 箱&#xff0c;每天上午出货 m 箱、下午进货 n 箱&#xff0c;若s≥m>n≥0&#xff0c;则第 k 天将会出现空仓的情况。请你帮仓库管理员编写程序&#xff0c;输入s、m 和 n&#xff0c;计算并输出 k。 输入格式 s,m,n (s≥m>n≥0) 输出格式 k 输入样例…

【网易低代码】第2课,页面表格查询功能

你好&#xff01; 这是一个新课程 CodeWave网易低代码 通过自然语言交互式智能编程&#xff0c;同时利用机器学 习&#xff0c;帮助低代码开发者进一步降低使用门槛、提高应用开发效率 【网易低代码】第2课&#xff0c;页面表格查询功能 1.拖拽表格组件到页面布局中2.服务端逻辑…