【C语言】qsort()函数排序及其模拟实现,万物皆可排!

🔥博客主页🔥:【 坊钰_CSDN博客 】

欢迎各位点赞👍评论✍收藏⭐

目录

 1. 函数介绍

 2. qsort举例排列整型变量

3. qsort举例排列结构型变量

3.1 按名字排序

3.1.1  srtcmp函数

3.2 按年龄排序

4. qsort函数模拟实现(采用冒泡的方式)

5. 小结


 1. 函数介绍

void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*));

可以看到qsort函数有四种参数,我们来一一解释:

1. void* base

指向要排序的数组的第一个对象的指针,转换为 void*,通俗来讲就是数组首元素地址;

2. size_t num

数组中指向的元素个数;

3. size_t size

数组中每个元素的大小(以字节为单位);

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

指向比较两个元素的函数的指针。
此函数通过比较两个元素反复调用。它应遵循以下原型:

将两个指针作为参数(都转换为 const void*)。该函数通过返回(以稳定和传递的方式)定义元素的顺序:

注意:qsort函数无返回值;

 2. qsort举例排列整型变量

#include <stdio.h>


int cmp_imp(const void* p1, const void* p2)
{
	return *(int*)p1 - *(int*)p2;
}

int main()
{
	int arr[] = { 2,3,4,1,5,7,6,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_imp);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", *(arr + i));
	}
	return 0;
}

3. qsort举例排列结构型变量

这是一个结构体

struct Student
{
	char name[100];
	int age;
};

3.1 按名字排序

这个用到了strcmp函数

3.1.1  srtcmp函数

int strcmp ( const char * str1, const char * str2 )

 返回值

 代码:

#include <stdio.h>

struct Student
{
	char name[100];
	int age;
};

void cmp_srt_imp(const void* p1, const void* p2)
{
	return strcmp(((struct Student*)p1)->name , ((struct Student*)p2)->name);
}

int main()
{
	struct Student arr[3] = { {"zhangsan",18},{"lisi",20},{"wangwu",19}};
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_srt_imp);
	for (int i = 0; i < sz; i++)
	{
		printf("%s %d ", arr[i]);
	}
	return 0;
}

3.2 按年龄排序

struct Student
{
	char name[100];
	int age;
};

void cmp_srt_imp(const void* p1, const void* p2)
{
	return ((struct Student*)p1)->age - ((struct Student*)p2)->age;
}

int main()
{
	struct Student arr[3] = { {"zhangsan",18},{"lisi",20},{"wangwu",19} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_srt_imp);
	for (int i = 0; i < sz; i++)
	{
		printf("%s %d ", arr[i]);
	}
	return 0;
}

4. qsort函数模拟实现(采用冒泡的方式)

用这样的方式qsort函数可排列任意的数据类型

代码:

#include <stdio.h>

//仿qsort函数重写冒泡排序

int cmp(const void* p1, const void* p2)     //所选择的比较方法
{
	return (*(int*)p1 - *(int*)p2);
}



void cmp_swap(char* p1, char* p2,int width)     //实现数组元素的交换
{
	for (int i = 0; i < width; i++)
	{
		int ret = *p1;
		*p1 = *p2;
		*p2 = ret;
		p1++;
		p2++;
	}
}


void bubble(void* base, int sz, int width, int (*cmp)(const void* p1, const void* p2))
{
	for (int i = 0; i < sz - 1; i++)   //冒泡排序趟数
	{
		for (int j = 0; j < sz - i - 1; j++)     //每一趟冒泡排序
		{
			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width )> 0)
			{
                  //符合条件进行交换
				cmp_swap(((char*)base+j*width), ((char*)base + (j+1) * width),width);
			}
		}
	}
}


int main()
{
	int arr[] = { 2,1,3,5,6,4,7,9,8,10 };       //定义整型数组并初始化
	int sz = sizeof(arr) / sizeof(arr[0]);      //计算数组长度
	bubble(arr,sz,sizeof(arr[0]),cmp);           //模拟qsort函数实现冒泡排序
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

5. 小结

以上就是关于qsort函数的内容了,具体还需宝子们去实践,如果觉得该博客对你有用的话,希望一键三连,点个关注不迷路,谢谢支持! 

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

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

相关文章

宝塔要注意的问题

数据库创建访问权限要全部人 反向代理1 打包dist,并不会有反向代理&#xff0c;所以宝塔里面要配置 反向代理2 这种去掉/api为/&#xff0c;上面的并没有去掉 rewrite ^/api/(.*)$ /$1 break;

mysql数据库表的数据显示到前端tableView

首先我们在ui视图设计中引入TableView, 定义一个model QSqlQueryModel *modelnew QSqlQueryModel(ui->tableView);model->setQuery(query);//将查询结果绑定到模型上ui->tableView->setModel(model); 将tableView内容设置成model然后就可以出现数据库的数据。示…

uni.uploadFile上传图片后台接收不到数据

今天遇到一个很奇怪的问题&#xff0c;通过使用uni.uploadFile上传文件时后端接收不到文件&#xff0c;查过很多资料&#xff0c;原来是自定义了header的Content-Type问题。取消即可&#xff0c;另把自定义文件上传的代码贴出来。 分析&#xff1a;当我们加上请求头的时候 不…

一.NODE MCU(ESP8285,ESP8286)开发环境搭建

一.序言: 1.esp8285长什么样? 2.esp8285是什么,能做什么? 通过上面图片,看到上面的芯片,是带有多个阵脚的单片机。实际上,看着该芯片很小,但是却具有完整的wifi无线蓝牙功能,它本身可以运行一个极简的linux小系统,并且该极简的小linux系统具备无线蓝牙功能。。它同…

了解光纤的最大损耗

在电信和数据传输领域&#xff0c;保持最佳的网络性能和可靠性至关重要。 影响网络完整性的关键因素之一是光纤中的信号丢失。信号损耗&#xff0c;也称为衰减损耗或光纤衰减&#xff0c;测量光缆输入和输出之间的光损耗量。本文将深入探讨光纤中的主要损耗&#xff0c;并指导您…

压缩感知的概述梳理(2)

参考文献 An efficient double-image encryption and hiding algorithm using a newly designed chaotic system and parallel compressive sensing 文献内容 梳理结果 列表形式 并行压缩感知核心元素 信号 x 和 s 信号 x: 稀疏信号信号 s: 非稀疏自然信号&#xff0c;在频…

数据库的创建

数据库分类 通过查看对象资源管理器来区分数据库类型 数据库物理文件的组成 : 数据库文件 日志文件 创建一个主数据文件和一个日志文件

数据结构--顺序表,链表,双向链表

数据结构的学习&#xff0c;从浅到深的学习&#xff0c;在了解他们的概念后&#xff0c;当然要明白他们分别是怎么实现的&#xff0c;同时通过对比来了解他们的异同点。 一.数据结构 1.1 什么是数据结构 所谓数据结构&#xff0c;拆开来讲&#xff0c;就是数据和结构。 数据…

n皇后问题-java

本次n皇后问题主要通过dfs&#xff08;深度优先搜索&#xff09;实现&#xff0c;加深对深度优先搜索的理解。 文章目录 前言 一、n皇后问题 二、算法思路 三、使用步骤 1.代码如下 2.读入数 3.代码运行结果 总结 前言 本次n皇后问题主要通过dfs&#xff08;深度优先搜索&#…

部署Hyperledger Fabric测试区块链网络

一. 快速启动区块链测试网络 启动Fabric虚拟机 将 fabric-samples.zip 拷贝进虚拟机 ubzip fabric-samples.zip 解压并重命名为fabric-samples mv fabric-samples-main fabric-samples 拷贝bin和config目录 cd fabric-samples cp ~/fabric/bin bin -r cp ~/fabric/config …

民族运动饮料之父『健力宝』×企企通正式启动SRM项目,打造饮料行业采购数字化应用标杆

近日&#xff0c;为推进采购阳光化、数字化和智能化&#xff0c;提升管理效率与质量&#xff0c;企企通与中国电解质饮料的领军品牌广东健力宝股份有限公司&#xff08;以下简称“健力宝”&#xff09;成功签约并召开项目启动会。健力宝行政副总裁赵总、CIO李总、采购本部总监杨…

矿用连续式负压自动排渣放水器——YC型

从今天起&#xff0c;努力去做一个可爱的人&#xff0c;不羡慕谁&#xff0c;也不埋怨谁&#xff0c;在自己的道路上&#xff0c;欣赏自己的风景&#xff0c;遇见自己的幸福。 矿用连续式负压自动排渣放水器——YC型 【1-5-9】产品介绍 连续式式负压自动排渣放水器采用双罐体结…

web自动化系列-selenium的3种等待方式(十一)

在ui自动化测试中&#xff0c;几乎出现问题最多的情况就是定位不到元素 &#xff0c;当你的自动化在运行过程中 &#xff0c;突然发现报错走不下去了 。很大概率就是因为找不到元素 &#xff0c;而找不到元素的一个主要原因就是页面加载慢 &#xff0c;代码运行速度快导致 。 …

Redis的RedisObject和对外可见的5种数据结构

目录 RedisObject Redis的编码方式 对外可见的5种数据结构 1.string string结构的源码 为什么是小于44字节会采用embstr编码&#xff1f; embstr和raw区别 2.list list结构的源码 3.set set结构的源码 4.zset zset结构的源码 5.hash hash结构的源码 Redis中…

EtherCAT开发_2_SSC使用记录

SSC快速开始参考《EtherCAT Slave Design Quick Guide》 字段内容直接参考SSC工具右侧Description&#xff0c;本文未填写。中文也可直接参考:《https://blog.csdn.net/g360250466/article/details/129847081》 ① Select EL9800 | 8Bit Digital I/O, 16Bit Analog Input 一、S…

Intel性能分析工具Vtune安装和使用简介

一、介绍 Intel Vtune profiler是用于串行和多线程应用程序的性能分析工具&#xff0c;可以帮助软件开发人员对应用程序的性能问题进行分析&#xff0c;支持包括linux和windows在内的多种操作系统。主要功能包括&#xff1a; 性能分析&#xff1a;可以对应用程序进行深入的性…

如何将低分辨率的视频变高清,使用AI工具分辨率画质增强至1080P、4K或者8K(附工具)

环境&#xff1a; Topaz Video AI 5.0 问题描述&#xff1a; 如何将低分辨率的视频变高清&#xff0c;使用AI工具分辨率画质增强至1080P、4K或者8K 原视频 增强1080P 解决方案&#xff1a; 1.打开软件&#xff0c;导入要处理的视频&#xff08;工具在本文最后附上&#xf…

网络安全:绕过 MSF 的一次渗透测试

这次渗透的主站是 一个 Discuz!3.4 的搭建 违法招 piao 网站&#xff0c; 配置有宝塔 WAF 用 Discuz!ML 3.X 的漏洞进行攻击&#xff0c;但是没有成功 发现主站外链会有一个发卡网&#xff0c;引导人们来这充值&#xff0c;是 某某发卡网&#xff0c;而且域名指向也是主站的 ip…

Stable Diffusion 模型分享:CyberRealistic XL(真实)cyberrealisticXL_v11VAE.safetensors

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八下载地址模型介绍

计算机网络基础:宏观认识

目录 一、网络发展背景与基本概念 二、网络协议的意义与TCP/IP五层结构模型 三、网络传输的基本流程与封装分用 四、ip地址和mac地址 随着信息技术的飞速发展&#xff0c;计算机网络已经成为了现代社会不可或缺的一部分。无论是工作、学习还是娱乐&#xff0c;我们几乎都离…