c语言-库函数qsort()初识

news2024/9/28 9:29:54

目录

  • 前言
  • 一、qsort()的介绍及使用
    • 1.1 qsort()的介绍
    • 1.2 qsort()的使用
      • 1.2.1 使用qsort|()对整型数组按照升序排序
      • 1.2.2 使用qsort()对整型数组按照降序排序
      • 1.2.3 使用qsort()对结构体数组数据进行排序
  • 二、利用冒泡排序模拟实现对任何数据进行排序
    • 2.1 冒泡排序
    • 2.2 模仿qsort()实现bubble_sort()对任何数据类型的数据排序
      • 2.2.1 代码实现
      • 2.2.2 测试对整型数组排序
      • 2.2.3 测试对结构体数组数据排序
  • 总结


前言

本篇文章介绍库函数qsort()的使用以及利用冒泡排序的思想模拟对任何类型的数据进行排序。


一、qsort()的介绍及使用

1.1 qsort()的介绍

在这里插入图片描述
在这里插入图片描述

qsort()可以对任意类型的数据进行排序。
对qsort()参数进行介绍:

void* base:指向需要被排序数组的起始位置。
size_t num:待排序的元素个数
size_t size:待排序的元素的大小(单位:字节)
int (*compar)(const void*, const void*):函数指针,指向比较函数,可以实现自定义比较规则。

1.2 qsort()的使用

1.2.1 使用qsort|()对整型数组按照升序排序

//升序
int compare_asc(const void* e1, const void* e2)
{
    return (*(int*)e1 - *(int*)e2);
}
int main()
{
    int arr[] = { 40, 10, 100, 90, 20, 25 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    qsort(arr, sz, sizeof(int), compare_asc);
    int i = 0;
    for (i = 0; i < sz; i++)
        printf("%d ", arr[i]);
    return 0;
}

1.2.2 使用qsort()对整型数组按照降序排序

//降序
int compare_dec(const void* e1, const void* e2)
{
    return (*(int*)e2 - *(int*)e1);
}


int main()
{
    int arr[] = { 40, 10, 100, 90, 20, 25 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    qsort(arr, sz, sizeof(arr[0]), compare_dec);
    int i = 0;
    for (i = 0; i < sz; i++)
        printf("%d ", arr[i]);
    return 0;
}

1.2.3 使用qsort()对结构体数组数据进行排序

按照年龄升序排序:

//定义结构体
struct Stu {
	char name[20];
	int age;
	float height;
};


//输出结构体数组数据
void print_stu(struct Stu* stu,int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%s\t%-6d\t%.2f\n", (stu + i)->name, (stu + i)->age, (stu + i)->height);
	}
}

//按照年龄升序进行排序
int compare_stuByAge_asc(const void* e1, const void* e2)
{
	return (((struct Stu*)e1)->age - ((struct Stu*)e2)->age);
}

int main()
{
	struct Stu student[3] = { {"zhangsan", 18, 170.50f},
							  {"lisi", 20, 185.25f},
							  {"wangwu", 17, 165.55f} };
	int sz = sizeof(student) / sizeof(student[0]);
	printf("原顺序\n");
	print_stu(student, sz);

	//按照年龄升序排序
	qsort(student, sz, sizeof(student[0]), compare_stuByAge_asc);
	printf("按照年龄升序\n");
	print_stu(student, sz);
	return 0;
}

二、利用冒泡排序模拟实现对任何数据进行排序

2.1 冒泡排序

void bubble_sort(int arr[], int sz)
{
	int i = 0;
	int flag = 1;//假设数据有序
	//排序趟数
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		//每趟要比较数据的个数
		for (j = 0; j < sz - 1 - i; j++)
		{
			//按照升序排序
			if (arr[j] > arr[j + 1])
			{
				//交换
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
				flag = 0;
			}
		}
		//当进行第一趟排序时,flag未改变,说明没有进行交换,数组有序
		if (1 == flag)
		{
			break;
		}
	}
}

int main()
{
    int arr[] = { 40, 10, 100, 90, 20, 25 };
    int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);
    int i = 0;
    for (i = 0; i < sz; i++)
        printf("%d ", arr[i]);
    return 0;
}

对比qsort()发现,bubble_sort()只能对整型数组数据进行排序,为了增加bubble_sort()的通用性,可以模仿qsort()的写法实现bubble_sort()对任何数据类型的排序。

2.2 模仿qsort()实现bubble_sort()对任何数据类型的数据排序

2.2.1 代码实现

//每次交换一个字节的内容
//循环交换width个字节的内容
void Swap(char* e1, char* e2, int width)
{
	char tmp = 0;
	int i = 0;
	for(i = 0; i < width; i++)
	{ 
		tmp = *e1;
		*e1 = *e2;
		*e2 = tmp;
		e1++;
		e2++;
	}
}

void bubble_sort(void* base, int sz,int width, int(*compare)(const void* e1, const void* e2))
{
	int i = 0;
	int flag = 1;//假设数据有序
	//排序趟数
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		//每趟要比较数据的个数
		for (j = 0; j < sz - 1 - i; j++)
		{
			//利用compare()回调函数, >0进行交换
			if (compare((char*)base+j*width, (char*)base+(j+1)*width) > 0)
			{
				//交换
				Swap((char*)base + j * width, (char*)base + (j + 1) * width,width);
				flag = 0;
			}
		}
		//当进行第一趟排序时,flag未改变,说明没有进行交换,数组有序
		if (1 == flag)
		{
			break;
		}
	}
}

2.2.2 测试对整型数组排序

//对数组进行升序
int compare_int_asc(const void* e1, const void* e2)
{
	return (*(int*)e1 - *(int*)e2);
}


//降序
int compare_int_dec(const void* e1, const void* e2)
{
	return (*(int*)e2 - *(int*)e1);
}

int main()
{
    int arr[] = { 40, 10, 100, 90, 20, 25 };
    int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz, sizeof(arr[0]),compare_int_dec);
    int i = 0;
    for (i = 0; i < sz; i++)
        printf("%d ", arr[i]);
    return 0;
}

2.2.3 测试对结构体数组数据排序

//定义结构体
struct Stu {
	char name[20];
	int age;
	float height;
};

//输出结构体数据
void print_stu(struct Stu* stu,int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%s\t%-6d\t%.2f\n", (stu + i)->name, (stu + i)->age, (stu + i)->height);
	}
}
//按照年龄升序进行排序
int compare_stuByAge_asc(const void* e1, const void* e2)
{
	return (((struct Stu*)e1)->age - ((struct Stu*)e2)->age);
}

//按照名字的字母序排序
int compare_stuByName(const void* e1, const void* e2)
{
	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}


int main()
{
	struct Stu student[3] = { {"zhangsan", 18, 170.50f},
							  {"lisi", 20, 185.25f},
							  {"wangwu", 17, 165.55f} };
	int sz = sizeof(student) / sizeof(student[0]);
	printf("原顺序\n");
	print_stu(student, sz);

	//按照年龄升序排序
	//bubble_sort(student, sz, sizeof(student[0]), compare_stuByAge_asc);

	//按照名字字母序
	bubble_sort(student, sz, sizeof(student[0]), compare_stuByName);
	//printf("按照年龄升序\n");
	printf("按照名字字母序\n");
	print_stu(student, sz);
	return 0;
}

总结

本篇文章介绍了库函数qsort()的使用,以及模仿qsort(),利用冒泡排序模拟实现对任何数据类型的数据进行排序。

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

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

相关文章

无锁队列 SPSC

无锁队列 SPSC Queuehttps://www.cnblogs.com/sinkinben/p/17949761/spsc-queue 在多线程编程中&#xff0c;一个著名的问题是生产者-消费者问题 (Producer Consumer Problem, PC Problem)。 对于这类问题&#xff0c;通过信号量加锁 (https://www.cnblogs.com/sinkinben/p/1…

06、Kafka ------ 各个功能的作用解释(ISR 同步副本、非同步副本、自动创建主题、修改主题、删除主题)

目录 CMAK 各个功能的作用解释★ ISR副本 (同步副本&#xff09;★ 非同步副本★ 自动创建主题★ 修改主题★ 删除主题 CMAK 各个功能的作用解释 ★ ISR副本 (同步副本&#xff09; 简单来说 &#xff0c;ISR 副本 就是 Kafka 认为与 领导者副本 同步的副本。 ISR&#xff0…

基于黄金正弦算法优化的Elman神经网络数据预测 - 附代码

基于黄金正弦算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于黄金正弦算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于黄金正弦优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

vue+nodejs微信小程序基于uniapp的学生宿舍打卡失物招领管理系统

基于微信的宿舍管理系统的设计基于现有的手机&#xff0c;可以实现等功能。方便用户对宿舍管理系统查看个人中心、失物招领管理、失物认领管理、晚归打卡管理、宿舍信息管理、宿舍更新管理、交流论坛、系统管理等功能模块的管理及详细的设计与统计分析。根据系统功能需求建立的…

JS手写apply,call,bind函数

本篇文章咱们来手写简易版的apply&#xff0c;call&#xff0c;bind函数。 实现思路 首先咱们需要思考下这三个函数放到哪里比较合适&#xff0c;因为这三个函数是被函数对象调用的&#xff0c;并且每个函数都可以调用&#xff0c;所以不难想到有一个位置非常合适&#xff0c;…

【每日论文阅读】生成模型篇

联邦多视图合成用于元宇宙 标题: Federated Multi-View Synthesizing for Metaverse 作者: Yiyu Guo; Zhijin Qin; Xiaoming Tao; Geoffrey Ye Li 摘要: 元宇宙有望提供沉浸式娱乐、教育和商务应用。然而&#xff0c;虚拟现实&#xff08;VR&#xff09;在无线网络上的传输是…

HNU-数据库系统-作业

数据库系统-作业 计科210X 甘晴void 202108010XXX 第一章作业 10.09 1.(名词解释)试述数据、数据库、数据库管理系统、数据库系统的概念。 数据&#xff0c;是描述事物的符号记录。 数据库&#xff08;DB&#xff09;&#xff0c;是长期存储在计算机内、有组织、可共享的大量…

windows安装nvm以及nvm常用命令

目录 1.什么是nvm以及为啥要用nvm 1.什么是nvm 2.为什么要用nvm 2.安装nvm 1. 下载 2. 安装 1.双击解压后的文件,nvm-setup.exe 2.同意 3.安装路径 4.下一步&#xff0c;这里有建议改成自己的文件夹&#xff0c;这个是用来存储通过nvm切换node后版本的存储路径 5.安装…

基础面试题整理2

1.抽象类与接口区别 语法&#xff1a; 抽象类用abstract定义&#xff1b;接口用interface定义抽象类被子类继承extends&#xff08;不可用final修饰&#xff09;&#xff1b;接口被类实现implements抽象类的属性访问无限制,方法不可用private修饰&#xff1b;接口中的方法只能…

DQL命令查询数据(三)

本课目标 掌握MySQL的多表查询 SQL语句的综合应用 多表连接查询 通过各个表之间共同列的关联性&#xff08;例如&#xff1a;外键&#xff09;来查询的 分类&#xff1a; 内连接(INNER JOIN) &#xff0c;可简写为 JOIN&#xff1b;左外连接(LEFT OUTER JOIN)&#xff0c;…

2023全球软件研发技术大会(SDCon2023)-核心PPT资料下载

一、峰会简介 本次峰会包含12大会议主题&#xff1a;云原生设施与平台、微服务架构实践、软件质量与效能、大数据实践与前沿、架构设计与演进、高可用与高性能架构、Web与大前端开发、编程语言与平台、AIGC与大模型、推荐系统实践、AI智能应用与研究、机器学习架构实践。 软件…

SpringCloud系列篇:核心组件之声明式HTTP客户端组件【远程消费】

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于SpringCloud的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一. 远程消费组件是什么 二. 远程消…

一个简单的KNN实现方法

对于许多离散问题&#xff0c;经过神经网络解决再通过softmax之后每一个值在[0,1]之间的连续变量&#xff0c;想要将其离散化&#xff0c;即离散化到每个元素都是 binary-variable&#xff0c;即 0-1 &#xff0c;这时可以用KNN方法&#xff0c;其实就是找到与这个向量的方差最…

JavaWeb——新闻管理系统(Jsp+Servlet)之jsp新闻修改

java-ee项目结构设计 1.dao:对数据库的访问&#xff0c;实现了增删改查 2.entity:定义了新闻、评论、用户三个实体&#xff0c;并设置对应实体的属性 3.filter&#xff1a;过滤器&#xff0c;设置字符编码都为utf8&#xff0c;防止乱码出现 4.service:业务逻辑处理 5.servlet:处…

力扣刷题记录(29)LeetCode:695、1020、130

695. 岛屿的最大面积 这道题和计算岛屿周长类似&#xff0c;在这里dfs的功能就是由一块陆地出发&#xff0c;找出这块陆地所在的岛屿并返回岛屿面积。 class Solution { public:int dfs(vector<vector<int>>& grid,int i,int j){if(i<0||i>grid.size())…

kannegiesser触摸屏维修CTT-11 4PP420.1043-K37

贝加莱触摸屏维修4PP420.1043-K37 kannegiesser工控机触摸屏维修CTT-11 工控机触摸屏维修常见故障现象 1、工控机开机有显示&#xff0c;但是屏幕很暗&#xff0c;用调亮度功能键调试无任何变化&#xff1b; 2、工控机开机触摸屏白屏或花屏&#xff0c;但是外接显示器正常&a…

2024——剑之所至,所向披靡

目录 *年度总结导航 一.开篇——写在篇头 二.工作篇——心之所向 1.CSDN记录篇 1,1博客主页 ​编辑1.2 第一篇博文 1.3.产品测试 1.4C站获奖博文 1.5团队创建 2.腾讯云记录篇 2.1博主的主页 2.2 博主好文推荐 2.3腾讯云产品体验 三.励志篇——未来可期 2023年…

编程语言的未来:贴近人类、灵活高效与探索无限

编程语言的未来&#xff1f; 在当今的科技潮流中&#xff0c;编程语言是至关重要的一环&#xff0c;更是赋能科技行业的基础工具。我深信&#xff0c;未来的编程语言可能将朝着更贴近人类、灵活高效和面向无限可能的方向发展。 人性化是我预期的第一个趋势。未来的编程语言将…

java CAS

CAS 在高并发场景&#xff0c;可以使用加锁 或者CAS来保证原子性&#xff0c;但是加锁是很重量级的操作&#xff0c;CAS类似于乐观锁CAS &#xff08; Compare and swap &#xff09;比较并交换&#xff0c;是实现并发算法时常用到的技术&#xff0c;包含三个操作数&#xff1…

MySql海量数据存储与优化

一、Mysql架构原理和存储机制 1.体系结构 2.查询缓存 3.存储引擎 存储引擎的分类 innodb&#xff1a;支持事务&#xff0c;具有支持回滚&#xff0c;提交&#xff0c;崩溃恢复等功能&#xff0c;事务安全myisam:不支持事务和外键&#xff0c;查询速度高Memory&#xff1a;利…