qsort使用

qsort

是用来排序的数据的库函数,底层使用的是快速排序的方式

 排序方式有:选择,冒泡,插入,快速, 希尔......

对于qsort这个库函数:

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

        其中 void* base 是指针,指向的是待排序的数组的第一个元素,

        num是base指向待排序数组的元素个数 ,

        size是指向的待排序数组的元素的大小.

        最后的*compar是函数指针,指向的是两个元素的比较函数函数.

        qsort的使用者需要明确指导要拍下吧的是什么数据,这些数据要怎么比较,所以需要提供两个元素的比较函数.

qsort举例

qsort能够排列任意数据

        qsort排列一段整形数据

int cmp_int(const void* n1, const void* n2)
{
	return *(int*)n1 - *(int*)n2;
}

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

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

        这个就能实现正序排列

         //void* 类型的指针是无具体类型的指针,这种类型的指针不能直接使用,需要转换类型.

        //对于qsort的指针指向的函数的返回类型 是int的类型 分别是大于0 等于0 小于0

        大于零就是n1指向的元素先于n2指向的元素

        等于零就是n1指向的元素等价n2指向的元素

        小于零就是n1指向的元素后于n2指向的元素

        如果要降序就把return的内容反过来就行 

        

        用qsort排序结构体数据

        按照名字排序

struct Stu
{
	char name[20];
	int age;
};
int cmp_struct_name(const void* n1, const void* n2)
{
	return strcmp(((struct Stu*)n1)->name, (*(struct Stu*)n2).name);
}
void testtow()
{
	struct Stu arr[3] =
	{
	{"Alili",10},
	{"Cawdaw",25},
	{"Baa",18}
	};
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]),cmp_struct_name);
	for (int i = 0; i < sz; i++)
	{
		printf("%s %d\n", arr[i].name,arr[i].age);
	}
}

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

        需要注意调用结构体的元素时,是利用指针调用(->,这个是间接访问操作符)还是元素调用(.直接访问)

         或者结构体中按照年龄比较 只需要把比较函数哪里结合第一个例子改一改就ok

struct Stu
{
	char name[20];
	int age;
};
int cmp_struct_name(const void* n1, const void* n2)
{
	return strcmp(((struct Stu*)n1)->name, (*(struct Stu*)n2).name);
}
int cmp_struct_age(const void* n1, const void* n2)
{
	return ((struct Stu*)n1)->age - (*(struct Stu*)n2).age;
}
void testtow()
{
	struct Stu arr[3] =
	{
	{"Alili",10},
	{"Cawdaw",25},
	{"Baa",18}
	};
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]),cmp_struct_age);
	for (int i = 0; i < sz; i++)
	{
		printf("%s %d\n", arr[i].name,arr[i].age);
	}
}

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

qsort的模拟实现

void Swap(char* n1, char* n2,size_t size)
{
	int i = 0;
	for (i = 0; i < size; i++)
	{
		char tmp = *n1;
		*n1 = *n2;
		*n2 = tmp;
		n1++;
		n2++;
	}
}

void my_bubble_sort(void* base, size_t sz,size_t size,int (*cmp)(const void * p1, const void* p2))
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - 1; j++)
		{
			if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
			{
				Swap((char*)base + j * size, (char*)base + (j + 1) * size,size);
			}
		}
	}
}
  
void tests()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	my_bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

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

         注意到为什么用char* 来接收 因为char能一个字节一个字节的访问,利用size的宽度可以访问任意长度的类型,因此可以排序各种各样的东西.因为具有这样的包容性,所以它也可以排序结构体.

        

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

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

相关文章

棋牌室计时计费管理系统的灯控器连接教程

棋牌室计时计费管理系统的灯控器连接教程 一、前言 以下教程以 佳易王棋牌室计时计费管理系统软件V18.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 如上图&#xff0c;计时计费软件在开始计时的时候&#xff0c;点击 开始计时 如果连接了…

第19章-IPv6基础

1. IPv4的缺陷 2. IPv6的优势 3. 地址格式 3.1 格式 3.2 长度 4. 地址书写压缩 4.1 段内前导0压缩 4.2 全0段压缩 4.3 例子1 4.4 例子 5. 网段划分 5.1 前缀 5.2 接口标识符 5.3 前缀长度 5.4 地址规模分类 6. 地址分类 6.1 单播地址 6.2 组播地址 6.3 任播地址 6.4 例子 …

java-ssm-jsp-宠物常规护理知识管理系统设计与实现

java-ssm-jsp-宠物常规护理知识管理系统设计与实现 获取源码——》公主号&#xff1a;计算机专业毕设大全

VirtualBox 桥接网卡 未指定 “未能启动虚拟电脑Ubuntu,由于下述物理网卡未找到:”

解决办法&#xff0c;安装虚拟网卡&#xff0c;win11查找方式&#xff1a;控制面板→网络和共享中心→更改适配器设置 此时出现下面情况就算安装成功 但是如果报错&#xff1a;找不到指定的模块 则按下面步骤删除干净垃圾重新上面操作 先安装CCleaner, 链接:CCleaner Makes Y…

Salesforce CPQ - 02 - Quote Price

最近又有客户来咨询学习Salesforce CPQ&#xff0c;所以本人总结了下近几年CPQ培训的一些实际案例拿出来分享给大家&#xff1b; 再次介绍下本人是一位Salesforce十多年的从业者。 先来介绍下Salesforce的价格体系&#xff0c;再介绍下各个Product Price是如何配置及使用的&a…

2024 年 5 大移动应用安全预测

2024 年已经到来&#xff0c;企业必须为接下来的事情做好准备。为未来做好准备需要回顾过去。企业可以从那里判断自己当前的状态&#xff0c;从而做出准确的预测。 移动应用程序安全仍然是企业关注的一个重要问题&#xff0c;特别是当消费者依赖应用程序来完成更重要的任务时。…

docker三剑客compose+machine+swarm小结

背景 在容器领域&#xff0c;不少公司会使用docker三剑客composemachineswarm进行容器编排和部署&#xff0c;本文就简单记录下这几个工具的用法 三剑客composemachineswarm compose compose主要是用于容器编排&#xff0c;我们部署容器时&#xff0c;容器之间会有依赖&…

【yolov8部署实战】VS2019环境下使用C++和OpenCV环境部署yolo项目|含详细注释源码

一、前言 之前一阵子一直在做的就是怎么把yolo项目部署成c项目&#xff0c;因为项目需要嵌套进yolo模型跑算法。因为自己也是本科生小白一枚&#xff0c;基本上对这方面没有涉猎过&#xff0c;自己一个人从网上到处搜寻资料&#xff0c;写代码&#xff0c;调试&#xff0c;期间…

Android 基础入门 基础简介

1. 观察App运行日志 2.Android 开发设计的编程语言 koltin Java c c 3.工程目录结构 4.Gradle 5.build.gradle 文件解析 plugins {id("com.android.application")//用了哪些插件 主配置文件版本控制 所以这里不用写版本 }android {namespace "com.tiger.myap…

C#入门:简单数据类型和强制类型转换

本文由 简悦 SimpRead 转码&#xff0c; 原文地址 mp.weixin.qq.com 本期来讲讲 unity 的脚本语言 —C#&#xff0c;C# 的简单数据类型及范围和强制类型转化的方法。这可是 unity 游戏开发必备技能。 1. 简单数据类型 各个类型的范围&#xff1a; byte -> System.Byte (字节…

STM32利用标准库编写程序proteus仿真流水灯

首先就是建立一个proteus工程&#xff0c;导入元器件画图&#xff1a; 接下来就是下载我已经都复制好的工程&#xff0c;下载后直接解压缩就能用&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1Nx5p3Tif6eHBIVkcPfsj9w?pwd1234 提取码&#xff1a;1234 解压后打开…

Ps:快照

“历史记录” History面板可分为快照区和历史记录状态区两个部分。 Photoshop 的快照 snapshot功能允许用户保存当前工作状态的完整副本&#xff0c;这包括图像的所有图层&#xff08;包括图层可见性&#xff09;、图层样式、选区以及颜色模式、位深度等其他属性。 通过创建当前…

《猛兽派对》好玩吗值得买吗?苹果电脑也能装《猛兽派对》吗?猛兽派对好友通行证 动物派对 猛兽对战游戏

目录 一、《猛兽派对》好玩吗&#xff1f; 游戏玩法&#xff1a; 物理引擎&#xff1a; 关卡设计&#xff1a; 游戏特色&#xff1a; 评价&#xff1a; 荣誉&#xff1a; 二、苹果电脑也能装《猛兽派对》吗&#xff1f; 第1步&#xff1a;下载并安装CrossOver这款软件…

【python】1.python3.12.2和pycharm社区版的安装指南

欢迎来CILMY23的博客喔&#xff0c;本篇为【python】1.python3.12.2和pycharm社区版的安装指南&#xff0c;感谢观看&#xff0c;支持的可以给个一键三连&#xff0c;点赞关注收藏。 目录 一、python3.12.2的下载与安装 1.1下载 1.2安装 二、pycharm的安装 2.1下载安装 2…

windows下安装cnpm

cnpm是淘宝团队开发的一个针对中国用户的npm镜像源&#xff0c;它是npm的一个定制版本。由于国外的npm源在国内访问速度较慢&#xff0c;所以cnpm镜像源可以提供更快的下载速度。cnpm的使用方式与npm基本相同&#xff0c;只需将npm替换为cnpm即可。 要想使用cnpm等先安装node.…

SPA首屏加载慢的优化方案

1、什么是首屏加载&#xff1f; 首屏加载时间主要看FCP(First Contentful Paint)这个指标&#xff0c;它指的是浏览器从响应用户输入网址地址&#xff0c;到首屏内容渲染完成的时间&#xff0c;此时整个网页不一定要全部渲染完成&#xff0c;但需要展示当前视窗需要的内容 首…

oppo手机备忘录记录怎么转移到华为手机?

oppo手机备忘录记录怎么转移到华为手机?使用oppo手机已经有三四年了&#xff0c;因为平时习惯&#xff0c;在手机系统的备忘录中记录了很多重要的笔记&#xff0c;比如工作会议的要点、读书笔记、购物清单、朋友的生日提醒等。这些记录对我来说非常重要&#xff0c;我可以通过…

ChatGPT-PLUS AI大语言模型源码

ChatGPT-PLUS 是一个开源的 AI 助手解决方案&#xff0c;它采用了 Go、Vue3 和 element-plus 进行开发。这个系统自带运营管理后台&#xff0c;开箱即用&#xff0c;非常方便。它集成了 OpenAI、Azure、ChatGLM、讯飞星火、文心一言等多个平台的大语言模型&#xff0c;还支持 M…

算法入门-二分搜索(长期更新)

文章目录 情景一 : 二分查找情景二 : 找出一个 > num 的最左侧的位置情景三 : 找出一个 < num 的最右侧的位置leetcode 162 :寻找峰值leetcode 69 : x 的平方根 首先来简介一下二分搜索算法,二分搜索是一种每次砍半的算法,最经典的案例当然是我们的二分查找算法,但是大部…

数据结构从入门到精通——顺序表

顺序表 前言一、线性表二、顺序表2.1概念及结构2.2 接口实现2.3 数组相关面试题2.4 顺序表的问题及思考 三、顺序表具体实现代码顺序表的初始化顺序表的销毁顺序表的打印顺序表的增容顺序表的头部/尾部插入顺序表的头部/尾部删除指定位置之前插入数据和删除指定位置数据顺序表元…