C语言快速排序——qsort函数

 

上面的是我们标准C语言库里面对qsort函数的介绍,我们先来从排序说起: 

这就不得不提出编程中最最基础的排序算法---冒泡排序 

对于一个任意的无序数列,我们如果想要把他排成顺序数列的话,我们就可以让每一项跟后面的一项去比较,然后交换两个数,最终得到一个有序数列:

void print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
void bubble_sort(int arr[], int sz)
{
	//趟数
	int i = 0;
	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;
			}
		}
	}
}

int main()
{
	//数据
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	print_arr(arr, sz);
	bubble_sort(arr, sz);//冒泡排序
	print_arr(arr, sz);
	return 0;
}

 我们可以看到运行截图,成功的得到了升序数列

但是冒泡排序有一个弊端就是:他只能排序整形数组的顺序,太过于局限,所以我们引入qsort函数 

qsort函数:

我们来个代码体会一下:

这是排序整型数组的:

#include <stdlib.h>
#include <string.h>

int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}

//测试qsort排序整型数据
void test1()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	print_arr(arr, sz);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	print_arr(arr, sz);
}
int main()
{
	//数据
	test1();
	//test2();
	//test3();
	return 0;
}

那么如果我要想排结构体类型的该怎样写代码呢?🤔🤔🤔 

1、按照结构体里的年龄排序:

//测试qsort排序结构体数据
struct Stu
{
	char name[20];
	int age;
};
//结构体数据怎么比较呢?
//1. 按照年龄比较
//2. 按照名字比较

int cmp_stu_by_age(const void* e1, const void* e2)
{
	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}

void test2()
{
	struct Stu arr[] = { {"zhanhsan", 20}, {"lisi", 30}, {"wangwu", 12} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_stu_by_age);
}

 

 

2、按照结构体里的名字长度排序 :


int cmp_stu_by_name(const void* e1, const void* e2)
{
	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}

void test3()
{
	struct Stu arr[] = { {"zhanhsan", 20}, {"lisi", 30}, {"wangwu", 12} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_stu_by_name);
}

我们可以看到通过qsort函数来对任意类型的变量进行排序,相信大家也能通过上面的讲解来体会到qsort的强大之处,希望大家可以更用心地学习C语言。🌹🌹🌹 

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

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

相关文章

基于汽车胎压检测及温度预警

课题简介 汽车胎压监测系统可分为两种&#xff1a;一种是间接式胎压监测系统&#xff0c;是通过轮胎的转速差来判断轮胎是否异常&#xff1b;另一种是直接式胎压监测系统&#xff0c;通过在轮胎里面加装四个胎压监测传感器&#xff0c;在汽车静止或者行驶过程中对轮胎气压和温…

轻量化的yolov8部署到安卓Android手机端

一、pytorch环境配置和yolov8源码安装 首先在电脑上需要配置好pytorch环境&#xff0c;和yolov8源码的下载 然后针对yolov8做自己的轻量化改进 二、下载Android Studio和ncnn-android-yolov8 1. Android Studio官网链接&#xff1a; 下载 Android Studio 和应用工具 - And…

语义补全任务2023年论文总结

一、3D Semantic Scene Completion: a Survey 语义场景补全SSC旨在联合估计出一个场景完整的几何和语义信息&#xff0c;假设只需要部分稀疏输入数据。 1、数据集 2、场景表示 Point Cloud&#xff0c;点云是一种方便的、记忆高效的表示方法&#xff0c;它将三维连续世界中的…

图灵机:计算机科学的奠基之作

图灵机的概念由英国数学家阿兰图灵在1936年提出&#xff0c;这个时期正是计算机科学的黎明时分。那个时候&#xff0c;人们还在使用机械计算器进行计算&#xff0c;而且这些计算器的功能都非常有限。 图灵提出这个概念的初衷&#xff0c;是为了解决所谓的“判定问题”&#xf…

关于react-native-reanimated 3.6.1在react native debugger报错问题

ExceptionsManager.js:158 Error: [Reanimated] UpdatePropsManager is not available on non-native platform. 在node_module下找到找到相关文件&#xff0c;注释掉相关代码 然后打补丁放在自己的项目下&#xff0c;关于打补丁在博客主页&#xff0c;自行查看讲解

番外篇-如何开发智能合约入门

今天咱们聊聊如何开发智能合约&#xff0c;非常入门的分享~ 1. 如何开发智能合约 1.1. 基本流程 & 主流工具 1.1.1. 编写合约代码 Solidity仍然是一骑绝尘&#xff08;EVM&#xff09;Vyper是不太活跃语言&#xff0c;python语法&#xff08;EVM&#xff09;Rust不能应…

【pwn】cmcc_simplerop --rop链的构造

程序保护情况检查 32位程序&#xff0c;堆栈不可执行 主函数&#xff1a; 左边又是一堆函数&#xff0c;file看一下 发现是静态链接&#xff0c;那ret2libc不用考虑了&#xff0c;接着看一下有没有int 80 那可以考虑利用rop链调用execve函数&#xff0c;用系统调用的函数参数是…

想做鸿蒙开发应该学会哪些知识?

鸿蒙开发学习是一项探索性的工作&#xff0c;旨在开发一个全场景分布式操作系统&#xff0c;覆盖所有设备&#xff0c;让消费者能够更方便、更直观地使用各种设备。 鸿蒙系统定位为面向未来、面向全场景&#xff08;移动办公、运动健康、社交通信、媒体娱乐等&#xff09;的分…

Mysql时间差8小时解决方案

目录 1. MySQL 本身的问题1-1. 验证MySQL时间1-2. 修改Mysql时区配置文件修改Mysql时区SQL修改Mysql时区 2.JDBC 连接的问题3. 返回 JSON 时间不对 在开发中&#xff0c;有可能会遇到这种情况&#xff1a; 插入数据库中的时间时正常。但是将时间传到前端页面上显示时&#xff…

Docker安装Elesticsearch7详细步骤

​ 1、创建安装目录 mkdir -p /usr/local/docker/es-docker 2、配置虚拟内存 如果不配置&#xff0c;后面启动es会报错。 max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 配置如下 vi /etc/sysctl.conf vm.max_map_coun…

光伏行业常用到的专业名词有哪些?都是什么意思?

光伏行业作为新能源领域的重要组成部分&#xff0c;涉及许多专业名词。本文将介绍一些常用的专业名词及其含义。 光伏电池&#xff1a;光伏电池是光伏发电系统的核心部件&#xff0c;能够将太阳能转换成直流电能。它是通过光生电效应工作的。 光伏组件&#xff1a;光伏组件是…

【vue3】vue3的应用实例是什么和怎么使用

简言 每个 Vue 应用都是通过 createApp 函数创建一个新的应用实例。 应用实例指的就是createApp的返回值&#xff0c;它是一个对象&#xff0c;里面包含了多个vue相关的属性&#xff0c;例如component&#xff08;组件&#xff09;、directive&#xff08;指令&#xff09;use…

自动化测试数据校验神器!

在做接口自动化测试时&#xff0c;经常需要从接口响应返回体中提取指定数据进行断言校验。 今天给大家推荐一款json数据提取神器: jsonpath jsonpath和常规的json有哪些区别呢&#xff1f;在Python中&#xff0c;json是用于处理JSON数据的内置模块&#xff0c;而jsonpath是用…

代码随想录 516. 最长回文子序列

题目 给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 示例 1&#xff1a; 输入&#xff1a;s “bbbab” 输出&…

Jmeter接口自动化03-JMeter的常用核心组件

p03 高清B站视频链接 由于JMeter涉及的组件数目很多&#xff0c;据不完全统计至少有110个&#xff0c;而其实只需要掌握20%的组件就可以完成80%甚至更多的日常工作了&#xff0c;所以接下来我们重点剖析使用最频繁的核心组件&#xff0c;如下图所示。只需要优先掌握这10个左右…

百家大吉·夕阳关爱——昌岗街微型养老博览会

居民热情参与博览会 为让长者了解及选择适合自己的养老服务&#xff0c;昌岗街在2023年12月27日开展以“百家大吉夕阳关爱”为主题的昌岗街微型养老服务公益博览会活动&#xff0c;通过搭建养老服务机构供需服务平台&#xff0c;拓宽社区长者了解正规养老服务机构的渠道&#…

部署ATS(Apache Traffic Server)和Nginx正向代理服务性能对比

部署ATS&#xff08;Apache Traffic Server&#xff09;和Nginx正向代理服务&性能对比 1. 正向代理的用途2. ATS(Apache Traffic Server)正向代理服务器部署3. Nginx正向代理服务器部署4. 性能对比 1. 正向代理的用途 正向代理一般是用于内部网络出去&#xff0c;反向代理一…

三、GCC编译:链接

代码准备 main.c extern int shared; extern void func(int *a, int *b); int main(){int a 100;func(&a, &shared);return 0; }func.c int shared 1; int tmp 0; void func(int *a, int *b){tmp *a;*a *b;*b tmp; }静态链接 编译 gcc -static -fno-stack-p…

【Leetcode】2696. 删除子串后的字符串最小长度

文章目录 题目思路代码 题目 2696. 删除子串后的字符串最小长度 思路 计算通过删除字符串中的 “AB” 和 “CD” 子串后&#xff0c;可获得的最终字符串的最小长度。 主要思路是使用一个栈来模拟字符串的处理过程&#xff0c;每次遍历字符串时&#xff0c;如果当前字符和栈…

open3d相关操作总结

open3d其实有很多交互式命令&#xff0c;在运行程序打开了open3d渲染的窗口后&#xff0c;鼠标点击窗口&#xff0c;按H就会弹出&#xff0c;交互命令的帮助&#xff0c;如下图所示&#xff1a; 其中比较常用的有&#xff1a; Q &#xff1a;退出当前窗口 H&#xff1a;打印帮…