C语言:qsort的使用方法

news2024/11/15 22:48:02

目录

1. qsort是什么?

2. 为什么要使用qsort

3. qsort的使用

3.1 qsort的返回值和参数

3.2 qsort的compare函数参数

3.3 int类型数组的qsort完整代码

4. qsort完整代码


1. qsort是什么?

qsort中的q在英语中是quick,快速的意思了,sort就是排序,故名为快速排序

2. 为什么要使用qsort

它和冒泡排序都能帮助我们排好序,为什么要使用快速排序

因为它快速,在数据量很大的时候我们用快速排序的效率是非常高的

并且它不仅可以用于计算机的内置类型(int、double、float、char......)

而且还可以用于自己定义的类型(结构体、枚举......)

3. qsort的使用

首先,要想使用qsort需要包含头文件 stdlib.h,然后就可以使用了

先来看看qsort的返回值和参数

3.1 qsort的返回值和参数

base为你要排序数组的首地址,类型为void*

因为qsort的开发人员并不知道你需要排序的是一个整型数组还是浮点型数组还是字符串,

所以这个指针不能写死为某一个类型,而是用来void*,void* 可以用来接受任何的类型,但它不能进行加减或者解引用运算,有利有弊

num为需要排序数组的大小,类型为size_t,无符号整型,大小只能为正或0不能为负

size为数组一个元素的字节大小,类型为size_t,也是只能为正或0不能为负 

最后一个compar为一个函数指针,函数返回值为int类型,里面的参数是两个const void*

compare是用来比较两个数字(字符)的大小,从而进行排序

如果对这个参数不是很了解可以看看我之前写的文章有写到函数指针和函数指针数组

C语言:指针的进阶讲解-CSDN博客

3.2 qsort的compare函数参数

这个compare函数是需要我们自己写的,是的,就是这么麻烦,但是熟悉之后这个函数很容易就能写的出来

因为创造者并不知道我们需要排的是个什么数组,只有我们使用者才知道,所以创造者只能用你给的一些参数的信息来使用qsort进行排序

int Compare(const void* a, const void* b)
{
	return *(int*)a - *(int*)b;
}

 这是一个用于排序整型的compare函数

首先要写出这个函数我们的返回值和参数必须要跟它需要的一样

我们要比较两个数字的大小,那么我们首先要对这两个void类型的指针解引用拿到地址里面的值才能进行比较,最后返回一个正数或者负数

但是我们知道void* 是不能进行解引用操作的,所以我们必须得要先把这两个参数强制类型转换为int* 然后才能进行解引用操作拿到里面的值最后进行比较返回正数或者负数即可

3.3 int类型数组的qsort完整代码

#include <stdio.h>
#include <stdlib.h>

void Print(int* arr, int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}
}

int Compare(const void* a, const void* b)
{
	return *(int*)a - *(int*)b;
}

int main()
{
	int arr[] = { 1,4,5,7,2,3,6,9,8,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), Compare);
	Print(arr, sz);
	return 0;
}

 3.4 char类型数组的qsort完整代码

 字符compare也是类似,但还是有很多细节要改变

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

void Print(char* arr, int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%c ", arr[i]);
	}
}

int Compare(const void* a, const void* b)
{
	return strcmp((char*)a, (char*)b);
}

int main()
{
	char arr[] = "bdeafcg";
	int sz = strlen(arr);
	qsort(arr, sz, sizeof(arr[0]), Compare);
	Print(arr, sz);
	return 0;
}

首先我们需要引用string.h头文件使用一些关于字符串操作的函数

数组个数sz的计算不能是前面整型的那种方式了,需要用库函数strlen计算数组大小

在比较函数里需要使用strcmp比较两个字符,这里面不需要解引用,因为这个strcmp的两个参数都是需要指针,所以传地址即可

qsort甚至还可以用于结构体

具体需要可以看以下完整代码

4. qsort完整代码

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


typedef struct student
{
	char name[20];
	int age;
}STU;


int compare1(void* a, void* b)
{
	return *(int*)a - *(int*)b;
}


int compare2(void* a, void* b)
{
	return strcmp((char*)a, (char*)b);
}


int compare3(void* a, void* b)
{
	return *(float*)a - *(float*)b;
}


int compare4(void* a, void* b)
{
	return strcmp(((STU*)a)->name, ((STU*)b)->name);
}


int compare5(void* a, void* b)
{
	return ((STU*)a)->age - ((STU*)b)->age;
}


void print1(int* arr, int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}
}


void print2(char* arr, int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%c ", arr[i]);
	}
}


void print3(float* arr, int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%.2f ", arr[i]);
	}
}


void print4(STU* arr, int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%s ", arr[i].name);
	}
}


void print5(STU* arr, int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%d ", arr[i].age);
	}
}


void test1()
{
	int arr[] = { 9,6,3,5,8,2,1,7,4 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), compare1);
	print1(arr, sz);
}


void test2()
{
	char arr[] = "fdghabce";
	int sz = strlen(arr);
	qsort(arr, sz, sizeof(arr[0]), compare2);
	print2(arr, sz);
}


void test3()
{
	float arr[] = { 1.1,0.5,3.14,9.4,10.5,1.7 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), compare3);
	print3(arr, sz);
}


void test4()
{
	STU arr[] = { {"zhangsan", 26}, {"lisi", 56}, {"wangwu", 18} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), compare4);
	print4(arr, sz);
}


void test5()
{
	STU arr[] = { {"zhangsan", 26}, {"lisi", 56}, {"wangwu", 18} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), compare5);
	print5(arr, sz);
}


int main()
{
	//test1();
	//test2();
	//test3();
	//test4();
	test5();
	return 0;
}


感谢观看

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

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

相关文章

Platformview在iOS与Android上的实现方式对比

Android中早期版本Platformview的实现基于Virtual Display。VirtualDisplay方案的原理是&#xff0c;先将Native View绘制到虚显&#xff0c;然后Flutter通过从虚显输出中获取纹理并将其与自己内部的widget树进行合成&#xff0c;最后作为Flutter在 Android 上更大的纹理输出的…

【经验】f-string 的一些点

【经验】f-string 的一些点 省几个字别数错了对齐它现在几点 省几个字 让 f-string 给你写表达式&#xff0c;在 f-string 中使用 来自动打印表达式 a 10 b 25 print(f"{a b }") >>> a b 35别数错了 对于过大的数字难以一眼看出来它的数量级&#xf…

Access AR Foundation 5.1 in Unity 2022

如果已经下载安装了ARF但版本是5.0.7 可以通过下面的方式修改 修改后面的数字会自动更新 更新完成后查看版本 官方文档 Access AR Foundation 5.1 in Unity 2021 | AR Foundation | 5.1.2

93. 通用防重幂等设计

文章目录 一、防重与幂等的区别二、幂等性的应用场景三、幂等性与防重关系四、处理流程 一、防重与幂等的区别 防重与幂等是在 Web 应用程序和分布式系统中重要而又非常常见的问题。 防重 防重是指在多次提交同样的请求过程中&#xff0c;系统会检测和消除重复的数据&#xf…

网络安全: Kali Linux 使用 docker-compose 部署 openvas

目录 一、实验 1.环境 2.Kali Linux 安装docker与docker-compose 3.Kali Linux 使用docker-compose方式部署 openvas 4. KaliLinux 使用openvas 二、问题 1. 信息安全漏洞库 2.信息安全漏洞共享平台 3.Windows 更新指南与查询 4.CVE 查询 5.docker-compose 如何修改o…

适配Ollama的前端界面Open WebUI

在前文 本地大模型运行框架Ollama 中&#xff0c;老苏留了个尾巴&#xff0c;限于篇幅只是提了一下 Open WebUI&#xff0c;有网友留言说自己安装没搞定&#xff0c;今天我们来补上 文章传送门&#xff1a;本地大模型运行框架Ollama 什么是 Open WebUI &#xff1f; Open WebUI…

深度学习_19_卷积

理论&#xff1a; 目前问题在于识别图片所需要的模型权重数量会比较大 一般图片像素在12M也就是一千两百万像素&#xff0c;要用模型对其整体识别的话&#xff0c;需要至少一千两百万权重&#xff0c;那也仅仅是线性模型&#xff0c;若用多层感知机的话&#xff0c;模型的数据…

【Flutter 面试题】在flutter里streams是什么?有几种streams?有什么场景用到它?

【Flutter 面试题】在flutter里streams是什么&#xff1f;有几种streams&#xff1f;有什么场景用到它&#xff1f; 文章目录 写在前面解答补充说明**Single subscription streams** 读取文件广播流 Broadcast streams 通知多个监听器关于状态的变化 写在前面 关于我 &#xf…

智慧城市的创新实践:全球案例分享

一、引言 在全球化和数字化的时代&#xff0c;智慧城市已经成为城市发展的前沿趋势。智慧城市运用先进的信息技术&#xff0c;如大数据、物联网、云计算和人工智能等&#xff0c;提升城市管理的智能化水平&#xff0c;增强公共服务效率&#xff0c;优化居民生活质量。本文将通…

python自动化管理和zabbix监控网络设备(zabbix部署监控网络设备以及验证部分)

目录 前言 一、Zabbix搭建 二、FW1 三、python脚本 四、core-sw1 五、core-sw2 六、DMZ-sw1 前言 详细配置视频解析访问&#xff1a;白帽小丑的个人空间-白帽小丑个人主页-哔哩哔哩视频 一、Zabbix搭建 sed -i s/SELINUXenforcing/SELINUXdisable/ /etc/selinux/config…

AWTK 开源串口屏开发(11) - 天气预报

# AWTK 开源串口屏开发 - 天气预报 天气预报是一个很常用的功能&#xff0c;在很多设备上都有这个功能。实现天气预报的功能&#xff0c;不能说很难但是也绝不简单&#xff0c;首先需要从网上获取数据&#xff0c;再解析数据&#xff0c;最后更新到界面上。 在 AWTK 串口屏中…

es集群的详细搭建过程

目录 一、VM配置二、集群搭建三、集群配置 一、VM配置 VM的安装 VMware Workstation 15 Pro的安装与破解 VM新建虚拟机 VM新建虚拟机 二、集群搭建 打开新建好的服务器&#xff0c;node1&#xff0c;使用xshell远程连接 下载es&#xff1a;https://www.elastic.co/cn/down…

HTML+CSS:未来属于CSS

效果演示 一个带有不同背景颜色的网格布局&#xff0c;其中一些元素可能会更大或者字体更大。 Code <main><div></div><div></div><div></div><div></div><div class"big"></div><div><…

IP-guard邮件管控再升级,记录屏幕画面,智能阻断泄密邮件

邮件是工作沟通以及文件传输的重要工具,却也成为了信息泄露的常见渠道。员工通过邮件对外发送了什么内容,是否含有敏感信息都无从得知,机密通过邮件渠道外泄也难以制止。想要防止企业的重要信息通过邮件方式泄露,我们不仅需要通过技术措施对外发邮件的行为进行规范,也要对…

基于 Vue3打造前台+中台通用提效解决方案(上)

基于 Vue3打造前台+中台通用提效解决方案 1、项目架构 本项目使用vite + vue3来实现前中台解决方案 2、为什么使用vite ? 因为,之前的项目一直都是使用webpack作为构建工具;vite出来这么久了,也没有用过;所以想在当前项目下进行使用; 2.1、为什么vite比webpack块? …

25.基于springboot + vue实现的前后端分离-停车管理系统(项目 + 论文)

项目介绍 系统包含用户和管理员两个角色 用户&#xff1a;登录、注册、个人中心、预定停车位、缴费信息 管理员&#xff1a;登录、用户信息管理、车位信息管理、车位费用管理、停泊车辆管理、车辆进出管理、登录日志查询 技术选型 开发工具&#xff1a;IDEA 服务器&#…

本科毕业设计:计及并网依赖性的分布式能源系统优化研究。(C语言实现)(内包含NSGA II优化算法)(一)

目录 前言 1、分布式能源系统模型介绍 2、运行策略 前言 本篇文章介绍的是我的毕业设计&#xff0c;我将C语言将其实现。 1、分布式能源系统模型介绍 这是我将研究的分布式能源系统的框架&#xff0c;内部供能装置包括&#xff1a;太阳能光伏板&#xff1b;sofc燃料电池、太阳…

Leetcode1642. 可以到达的最远建筑

Every day a Leetcode 题目来源&#xff1a;1642. 可以到达的最远建筑 解法1&#xff1a;反悔贪心 在移动的过程中&#xff0c;我们会需要若干次需要使用砖块或者梯子的情况。假设当前我们需要移动到下一建筑物&#xff0c;但必须使用 1 架梯子或者 Δh 个砖块&#xff0c;那…

docker 创建RedHat8.5镜像

确定要创建的小红帽版本&#xff0c;可以进入官网查看 https://hub.docker.com/search?qRedHat 复制命令到安装docker的机器上&#xff0c;拉取小红帽镜像。 docker pull redhat/ubi8:latest 执行完成后&#xff0c;查看镜像是否拉取成功 docker images |grep redhat 如图…

《Spring Security 简易速速上手小册》第3章 用户认证机制(2024 最新版)

文章目录 3.1 认证流程3.1.1 基础知识详解认证流程的核心概念认证流程的步骤 3.1.2 主要案例&#xff1a;内存用户认证案例 Demo&#xff1a;快速启动你的 Spring Boot 守护程序 3.1.3 拓展案例 1&#xff1a;数据库用户认证案例 Demo&#xff1a;让数据库守护你的秘密 3.1.4 拓…