qsort介绍与实现

news2025/4/5 20:21:40

qsort

qsort 是 C 标准库中的一个通用排序函数,位于 <stdlib.h> 头文件中。它可以对任意类型的数组进行排序,使用的是快速排序(Quick Sort)算法的变种。
在这里插入图片描述
参数说明
base:指向要排序的数组的第一个元素的指针。由于是 void* 类型,所以可以指向任意类型的数组。
num:数组中元素的个数。
size:每个元素的大小(以字节为单位)。
compar:一个指向比较函数的指针,该比较函数用于确定元素之间的顺序。比较函数的原型必须是 int (*compar)(const void *, const void *)。

比较函数介绍
比较函数的具体比较方式,需要由使用人自己去实现.
其必须接受两个参数类型为const void*的参数,返回类型为int型
其比较原理在c++官网上可以查到,如下:
在这里插入图片描述
如果返回值小于 0,表示第一个参数所指向的元素小于第二个参数所指向的元素。
如果返回值等于 0,表示两个元素相等。
如果返回值大于 0,表示第一个参数所指向的元素大于第二个参数所指向的元素。
使用示例
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct stu
{
	char name[20];
	int age;
};
//以结构体中名字大小为依据进行排序
int cmp_stu_name(const void* e1, const void* e2)
{
	//比较字符串大小用strcmp函数
	//将e1,e2强转类型进行比较
	//因为strcmp比较完后返回的结果与比较函数所需返回大小一致,所以可以直接返回strcmp比较完所得值
	return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
}

int main()
{

	struct stu arr[] = { {"zhangsan",18},{"wangwu",20} };//定义两个结构体变量,用于测试qsort函数
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_stu_name);
	for(int i = 0;i<sz;i++)
	printf("%s %d", arr[i].name, arr[i].age);

	return 0;
}

自我实现

qsort函数可以通过类似于冒泡排序的方式实现;

#include<stdio.h>
#include<string.h>
struct stu
{
	char name[20];
	int age;
};
//比较函数的自我实现,通过strcmp来比较name大小
int cmp_stu_name(const void* e1, const void* e2)
{
	return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
}
void swap(void* p1, void* p2, int size)
{
	//由于类型未知,所以将传过来的数据对应的字节一一调换
	for (int i = 0;i < size;i++)
	{
		char tmp = *((char*)p1 + i);
		*((char*)p1 + i) = *((char*)p2 + i);
		*((char*)p2 + i) = tmp;
	}
}
//width为传过来参数的大小  cmp为回调函数
void bubble_sort(void* base, int num, int width, int (*cmp) (void* e1, void* e2))
{
	//调用cmp_stu_name函数,如果返回值大于0,则交换顺序
	int i = 0;
	int j = 0;
	for (i = 0;i < num;i++)
	{
		int flag = 1;//如果顺序调换,则数组还是乱序,值改为0;反正有序退出循环
		for (j = 0;j < num;j++)
		{
			//为了能够比较任意类型的数据,将base强转为char*类型进行比较
			if ((cmp((char*)base + j * width, (char*)base + (j + 1) * width)) > 0)
			{
				swap((char*)base + j * width, (char*)base + (j + 1) * width,width);
			}
		}
	}
}

void test()
{

	struct stu arr[] = { {"zhangsan",18},{"lisi",20} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	//模仿qsort函数的参数
	bubble_sort(arr, sz, sizeof(arr[0]), cmp_stu_name);
	for(int i = 0;i<sz;i++)
	printf("%s %d\n", arr[i].name, arr[i].age);
}

int main()
{
	test();
	return 0;
}

比较函数与qsort处同理;在此具体要实现的是qsort的内部原理,要注意的是由于使用者传来的数据是未知的,所以要转为char*类型的数据,通过width宽度来找到数据,从而进行交换

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

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

相关文章

WPF创建自定义类和控件及打包成dll引用

WPF创建自定义类和控件及打包成dll引用 一、前言二、创建自定义类和控件并生成dll文件2.1创建类库项目2.2创建自定义类和控件2.3生成dll文件 三、在其他项目中引用3.1添加dll文件引用3.2cs文件中引用命名空间3.3XAML文件中引用命名空间 一、前言 出于一些代码复用的需求&#…

DVWA-DOM型XSS全等级绕过方法

DOM型XSS全等级绕过 前言一、LOW级别二、Medium级别 图片插入语句法 三、High级别 字符 # 绕过服务端过滤 四、Impossible级别 前言 DOM&#xff0c;全称Document Object Model&#xff0c;是一个平台和语言都中立的接口&#xff0c;可以使程序和脚本能够动态访问和更新文档…

《[含文档+PPT+源码等]精品基于Python实现的Django中药材在线学习系统的设计与实现

基于Python实现的Django中药材在线学习系统的设计与实现背景&#xff0c;可以从以下几个方面进行阐述&#xff1a; 一、行业背景 随着中医药在全球范围内的不断推广和普及&#xff0c;中药材的知识普及和在线学习需求日益增长。传统的中药材学习方式往往受限于地域、时间和资…

数组和指针常见笔试题(深度剖析)

strlen和sizeof的区别 strlen是统计\0之前的字符个数&#xff0c;传递的是地址 sizeof是计算类型的字节数&#xff0c;其实在编译期间会通过类型来确定大小 下边我来讲一下常见的面试题&#xff0c;过程很详细放心观看 #include<stdio.h>#include <string.h>int …

网络通信-最大传输单元-MTU,网络安全零基础入门到精通实战教程!

文章目录 MTU 引用MTU 介绍 定义MTU 与 VLAN TagVLAN Tag 处理方式 IP分片可靠传输MTU 之 PMTUD PMTUD介绍IP头的DF分片位 DF 0 可以分片DF 1 不可以分片 注意事项 MTU 引用 以太网最初对报文长度没有限制&#xff0c;网络层最大可以接收65535个字节&#xff0c;但是以太…

在nodejs中使用ElasticSearch(一)安装,使用

使用docker安装ElasticSearch和Kibana 1&#xff09;创建相应的data文件夹和子文件夹用来持久化ElasticSearch和kibana数据 2&#xff09;提前创建好elasticsearch配置文件 data/elasticsearch/config/elasticsearch.yml文件 # Elasticsearch Configuration # # NOTE: Elas…

封装一个vue3控制并行任务数量的组合式函数

一. 使用场景 使用环境&#xff1a; vue3 当需要处理多个异步任务时&#xff0c;想要控制并行异步任务的数量&#xff0c;不想所有任务同时执行导致产生性能上的问题&#xff0c; 比如当需要同时发起多个网络请求&#xff0c;但又不想一次性发出过多请求导致服务器压力过大或…

SpringSecurity请求流转的本质

1. SpringSecurity核心源码分析 分析SpringSecurity的核心原理,那么我们从哪开始分析?以及我们要分析哪些内容? 系统启动的时候SpringSecurity做了哪些事情?第一次请求执行的流程是什么?SpringSecurity中的认证流程是怎么样的?1.1 系统启动 当我们的Web服务启动的时候,…

【AI工具之Deepseek+Kimi一键免费生成PPT】

1.打开Deepseek网页&#xff1a;DeepSeek 2.使用Deepseek获得一份PPT大纲&#xff08;输入背景需求约束条件进行提问&#xff09;如下图&#xff1a; 3.复制Deepseek输出的PPT大纲 4.打开Kimi网页&#xff1a;Kimi.ai - 会推理解析&#xff0c;能深度思考的AI助手 5.在Kimi中…

基于微信小程序的宿舍报修管理系统设计与实现,SpringBoot(15500字)+Vue+毕业论文+指导搭建视频

运行环境 jdkmysqlIntelliJ IDEAmaven3微信开发者工具 项目技术SpringBoothtmlcssjsjqueryvue2uni-app 宿舍报修小程序是一个集中管理宿舍维修请求的在线平台&#xff0c;为学生、维修人员和管理员提供了一个便捷、高效的交互界面。以下是关于这些功能的简单介绍&#xff1a; …

DeepSeek 助力 Vue 开发:打造丝滑的右键菜单(RightClickMenu)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

WLAN无线2.4G/5G频段划分和可用信道

互联网各领域资料分享专区(不定期更新)&#xff1a; Sheet

自己安装一台DeepSeek的服务器

找一台还可以的Linux服务器&#xff0c;登录后执行&#xff1a; curl -fsSL https://ollama.com/install.sh | sh 等待安装完成&#xff1a; 执行命令&#xff0c;根据服务器能力安装不同版本的AI模型&#xff1a; ollama run llama3.2 下一步就开始对话吧&#xff1a; llam…

StableDiffusion学习笔记——4、模型下载和学习

目录   大家好&#xff0c;我是阿赵。   继续学习StableDiffusion的使用。   这次来学习一下模型的相关知识 一、 什么是模型 之前我们了解过&#xff0c;在StableDiffusion里面生成图片或者视频&#xff0c;都需要先选择模型。模型用通俗的话来说&#xff0c;就是决定了…

微软宣布 Windows 11 将不再免费升级:升级需趁早

大家都知道如果你现在是Windows 10 系统&#xff0c;其实可以免费升级到正版 Windows 11&#xff0c;只要你的电脑配置满足 TPM2.0要求。 而最近微软已经公布了 Windows 10 的最后支持时间&#xff0c;也就是今年10月14日&#xff0c;在这之后微软将不再对Windows 10负责&#…

Java开发实习面试笔试题(含答案)

在广州一家中大公司面试&#xff08;BOSS标注是1000-9999人&#xff0c;薪资2-3k&#xff09;&#xff0c;招聘上写着Java开发&#xff0c;基本没有标注前端要求&#xff0c;但是到场知道是前后端分离人不分离。开始先让你做笔试&#xff08;12道问答4道SQL题&#xff09;&…

解析DrugBank数据库数据|Python

一、DrugBank 数据库简介 DrugBank 是一个综合性的生物信息学和化学信息学数据库&#xff0c;专门收录药物和靶点的详细信息。它由加拿大阿尔伯塔大学的 Wishart 研究组 维护&#xff0c;提供化学、药理学、相互作用、代谢、靶点等多方面的药物数据。DrugBank 结合了实验数据和…

专题 - Java Stream API

概述 分类 数据源 任何位置。 如:集合、数组、文件、随机数、 Stream 静态工厂等。 支持的数据类型 整型、长整型、双精度浮点型基本数据类型。引用数据类型。流管道的数据处理流程 流管道必须要有终止操作。否则永不执行,只是一个静默的无操作指令。流管道是懒运算的。当执…

【前端框架】vue2和vue3的区别详细介绍

Vue 3 作为 Vue 2 的迭代版本&#xff0c;在性能、语法、架构设计等多个维度均有显著的变革与优化。以下详细剖析二者的区别&#xff1a; 响应式系统 Vue 2 实现原理&#xff1a;基于 Object.defineProperty() 方法实现响应式。当一个 Vue 实例创建时&#xff0c;Vue 会遍历…

大模型WebUI:Gradio全解11——使用transformers.agents构建Gradio UI(3)

大模型WebUI&#xff1a;Gradio全解11——使用transformers.agents构建Gradio UI&#xff08;3&#xff09; 前言本篇摘要11. 使用transformers.agents构建Gradio UI11.3 创建和使用工具Tools11.3.1 默认工具箱与load_tool11.3.2 创建新工具11.3.3 管理代理的工具箱toolbox11.3…