手撕qsort函数

前言

本篇主要讲解的是qsort函数细节以及运用实例。

紧跟我的脚步一起手撕qsort函数吧~

欢迎关注​​个人主页:逸狼

更多优质内容:

拿捏c语言指针(上)

拿捏c语言指针(中)

拿捏c语言指针(下)


创造不易,可以点点赞吗~

如有错误,欢迎指出~



qsort函数介绍

qsort 函数可以实现任意数据的排序 

他的底层排序算法是快速排序,对应的头文件是string.h

我们在官网cplusplus中搜索 qsort函数 得到如图 参数 和 compar函数的返回值


参数解释

base

void*  base

base指向要排序数组的第一个元素(起始位置),void*是为了接收不同类型的数据


num

num 的返回类型是size_t 

base指向的数组的元素个数(待排序的数组的元素个数)

size

size 的返回类型是size_t 

base指向的数组的元素的大小(单位是字节)

compar

int (*compar)(const void*p1, const void*p2))函数的返回类型是int,他有两个参数分别是const void*p1const void*p2,void*是为了接收不同类型的数据,return返回时要 强制类型转化 为 被比较的数据的类型。

(*compar)是函数指针,该指针指向的函数是用来比较数组中的2个元素的,p1和p2分别指向两个不同的元素
compar函数是根据实际要比较的数据自己写的

应用qsort实现排序整形

利用qsort实现排序整形数组

//利用qsort实现排序整形数组
#include<stdio.h>
#include<stdlib.h>
int cmp_int(const void*p1,const void *p2)
{
	return *(int*)p1 - *(int*)p2;//(int*)是强制类型转换为int*类型
}
int main()
{
	int arr[10] = { 9,4,6,1,0,3,7,2,5,8 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	//排序前打印
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	//排序后打印
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

代码结果

应用qsort实现排序结构体

排年龄

将年龄排成升序

//利用qsort实现排序结构体数据
#include<stdio.h>
#include<stdlib.h>
//定义一个结构体
struct Stu
{
	char name[20];//名字
	int age;//年龄
};
//不能直接使用< > ==比较
//
//1.按照年龄比较
int cmp_by_age(const void* p1, const void* p2)
{
	return ((struct Stu*)p1)->age -((struct Stu*)p2)->age;
	//      (struct Stu*)代表将p1和p1强制类型转化为结构体指针类型
}
void test()
{
	struct Stu arr[] = { {"zs",66},{"ls",18},{"ww",35} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_by_age);
}

int main()
{
	//年龄排成升序
	test();
	return 0;
}


调试结果

未排序前


排序完成


排名字

将名字排成升序

//2.按照名字比较
int cmp_by_name(const void* p1, const void* p2)
{
	return strcmp(((struct Stu*)p1)->name , ((struct Stu*)p2)->name);
	//      (struct Stu*)代表将p1和p1强制类型转化为结构体指针类型
}
void test()
{
	struct Stu arr[] = { {"zhangsan",66},{"lisi",18},{"wangwu",35} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_by_name);
}


int main()
{
	//名字排成升序
	test();
	return 0;
}

库函数strcmp

其中,比较名字(实际上是比字符串大小)

这里需要运用库函数strcmp(对应的头文件是string.h)比较字符串大小(是按照对应位置上字符的ASCII值的大小比较的)
strcmp的返回值与qsort函数的返回值一致


调试结果

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

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

相关文章

Https证书续签-acme.sh-腾讯云之DnsPod

ename 域名切换到 DnsPod 上面解析 可以先看下之前的 acme.sh 介绍文章然后再来次补充更多。 之前说过了 acme.sh 在阿里云下的使用。 这里做个后续补充 之前的域名是在 ename 上的 &#xff0c;为了自动续签切换到 DnsPod 上面解析 注意事项 可以把原来 ename 上的解析先导出…

【程序员英语】【美语从头学】初级篇(入门)(笔记)Lesson 15 At the Department Store 在百货商店

《美语从头学初级入门篇》 注意&#xff1a;被 删除线 划掉的不一定不正确&#xff0c;只是不是标准答案。 文章目录 Lesson 15 At the Department Store 在百货商店会话A会话B笔记 Lesson 15 At the Department Store 在百货商店 会话A A: Can you help me, please? B: Sur…

电脑任务栏一直转圈圈怎么办 电脑底部任务栏卡死桌面没事的解决办法

最近有一些用户反映&#xff0c;自己的电脑底部任务看卡死桌面没事&#xff0c;不知道是什么原因&#xff0c;也不清楚应该如何解决&#xff0c;是由于资讯和兴趣页面加载时卡死导致的&#xff0c;将其关闭后即可解决&#xff0c;以下是小编提供的电脑任务栏一直转圈圈的解决方…

java 使用documents4j将XML转为pdf文件的方式

1.背景&#xff1a; 通过spire.doc.free将word转换成PDF时存在缺陷&#xff1a;只能获取前3页。获取全文另外需支付费用。 2.解决办法 使用documents4j&#xff0c;documents4j会保留原word文件中更多的样式&#xff0c;如修订模式下的差异化字体颜色、文档右侧修订记录等。 …

Paddlepaddle使用自己的VOC数据集训练目标检测(0废话简易教程)

一 安装paddlepaddle和paddledection&#xff08;略&#xff09; 笔者使用的是自己的数据集 二 在dataset目录下新建自己的数据集文件&#xff0c;如下&#xff1a; 其中 xml文件内容如下&#xff1a; 另外新建一个createList.py文件&#xff1a; # -- coding: UTF-8 -- imp…

K8s ingress-nginx根据请求目录不同将请求转发到不同应用

K8s ingress-nginx根据请求目录不同将请求转发到不同应用 1. 起因 有小伙伴做实验想要实现以下需求: 输入www.pana.com/app1访问app1的svc 输入www.pana.com/app2访问app2的svc 2. 实验 2.1 Dockerfile 先准备Dockerfile FROM nginx:1.20ADD index.html /usr/share/ngin…

长短期记忆神经网络

目录 LSTM 神经网络架构 分类 LSTM 网络 回归 LSTM 网络 视频分类网络 更深的 LSTM 网络 网络层 分类、预测和预报 序列填充、截断和拆分 按长度对序列排序 填充序列 截断序列 拆分序列 指定填充方向 归一化序列数据 无法放入内存的数据 可视化 LSTM 层架构 …

2024年的一些碎碎念(小目标)

新年开工好几天了&#xff0c;最近思绪非常混乱&#xff0c;因为入职软件测试又过去一年了&#xff0c;但是却没有达到像培训机构说的那样月薪过万&#xff0c;所以整个人很焦虑。最近也去投了简历&#xff0c;有个HR说跳槽太频繁拒绝了我&#xff0c;入行两年换了两家公司&…

【前端素材】推荐实用的后台管理系统ebazer电商平台模板(附带源码)

一、需求分析 后台管理系统网站是指用于管理和控制网站、应用程序或系统后台运行的管理工具。它通常是网站或应用程序的管理者、管理员或内容编辑人员使用的界面&#xff0c;具有一系列功能来管理用户、内容、数据和系统设置。以下是后台管理系统网站的功能和特点&#xff1a;…

微信小程序video 点击自动全屏播放

//因为这个地址可能是图片也可能是视频 点击 图片可以预览&#xff0c;点击视频可放大全屏自动播放。 代码如下 <view v-else :class{contentImg: x.picture.length0} style"margin-top: 10px;"v-for"(x1, y1) in x.picture" :key"y"><…

java基础之 注解与异常

注解 注解说明 用于对代码进行说明&#xff0c;可以对包、类、接口、字段、方法参数、局部变量等进行注解&#xff0c;它主要的作用有以下四个方面&#xff1a; 生成文档&#xff1a;通过代码里标识的元数据生成javadoc文档。编译检查&#xff1a;通过代码里标识的元数据让编…

Django后台管理(一)

一、admin介绍 Django 最强大的部分之一是自动管理界面。它从你的模型中读取元数据,提供一个快速的、以模型为中心的界面,受信任的用户可以管理你网站上的内容 官网:https://docs.djangoproject.com/zh-hans/4.1/ref/contrib/admin/ 提示 后台管理系统是管理人员使用,不是…

tritonserver学习之七:cache管理器

tritonserver学习之一&#xff1a;triton使用流程 tritonserver学习之二&#xff1a;tritonserver编译 tritonserver学习之三&#xff1a;tritonserver运行流程 tritonserver学习之四&#xff1a;命令行解析 tritonserver学习之五&#xff1a;backend实现机制 tritonserv…

通过视触觉多模态学习实现机器人泛化操作

这篇文章的主题是探讨如何通过融合视觉和触觉信息来提高强化学习的效率和泛化能力。作者提出了一种名为Masked Multimodal Learning&#xff08;M3L&#xff09;的新型学习策略。M3L的核心思想是在策略梯度更新和基于掩蔽自编码的表示学习阶段之间交替进行。 在策略梯度更新和基…

电商API接口获取电商平台商品详情|JAVA API接口|一篇文章带你搞定Java的数据库访问

一、前言 在应用程序开发中&#xff0c;需要使用数据库管理和存储各种数据。在Java中&#xff0c;提供了一个JDBC技术(Java Database Connectivity&#xff0c;JDBC&#xff0c;Java数据库连接)&#xff0c;它的作用是连接数据库并访问。电商平台数据的采集就经常用到JAVA请求…

密码学基本概念

密码学基本概念 密码学的安全目标至少包含三个方面: (1)保密性(Confidentiality):信息仅被合法用户访问(浏览、阅读、打印等),不被泄露给非授权的用户、实体或过程。 提高保密性的手段有:防侦察、防辐射、数据加密、物理保密等。 (2)完整性(Integrity):资源只有…

第十三章[管理]:13.3:pycharm的常用设置

一,pycharm配置注释模板 1,打开配置界面: pycharm->preference 英文:Editor->File and Code Templates->Python Script 中文:编辑器->文件和代码模板->Python Script 如图: 我们输入的内容: # @Project : ${PROJECT_NAME} # @File : ${NAME}.py # @Author …

相机图像质量研究(38)常见问题总结:编解码对成像的影响--呼吸效应

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

计算机视觉基础【OpenCV轻松入门】:获取图像的ROI

OpenCV的基础是处理图像&#xff0c;而图像的基础是矩阵。 因此&#xff0c;如何使用好矩阵是非常关键的。 下面我们通过一个具体的实例来展示如何通过Python和OpenCV对矩阵进行操作&#xff0c;从而更好地实现对图像的处理。 ROI&#xff08;Region of Interest&#xff09;是…

16.隐式类的定义和使用

目录 概述实践代码执行 结束 概述 实践 代码 package com.fun.scalaimport java.io.File import scala.io.Sourceobject ImplicitClassApp {def main(args: Array[String]): Unit {val file new File("data/wc.data")println(file.read())}implicit class FileE…