C语言:qsort的使用方法

目录

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;
}


感谢观看

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

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

相关文章

LeetCode_Java_动态规划系列(3)(题目+思路+代码)

338.比特位计数 给你一个整数 n &#xff0c;对于 0 < i < n 中的每个 i &#xff0c;计算其二进制表示中 1 的个数 &#xff0c;返回一个长度为 n 1 的数组 ans 作为答案。 class Solution {public int[] countBits(int n) {/** 思路&#xff1a;* 1.创建一个长度为 n…

智慧市容环境卫生管理信息系统建设项目初步设计参考指南

第四章项目建设方案 梳理和编制数据标准规范&#xff0c;为数据体系建设提供建设指导。数据标准规范体系是根据统一市容环卫基础数据资源建立的&#xff0c;从要素分类、编码、符号、制图、更新机制等层 面解决各类规划标准不衔接、各自为政问题。标准规范体系包括&#xff1…

回溯难题(算法村第十八关黄金挑战)

复原 IP 地址 93. 复原 IP 地址 - 力扣&#xff08;LeetCode&#xff09; 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1.2.201" 和 &q…

【计算机毕业设计】044学生管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

数据结构——算法与算法分析3,4

目录 1.分析算法时间复杂度的方法 举例&#xff1a; 1.数据集队时间复杂度的影响 2.空间复杂度 3.设计好算法的过程 1.分析算法时间复杂度的方法 举例&#xff1a; 1.数据集队时间复杂度的影响 一般只考虑最坏时间复杂度和平均时间复杂度 2.空间复杂度 3.设计好算法的过程…

【Android 内存优化】怎么理解Android PLT hook?

文章目录 前言什么是hook?PLT hook作用基本原理PLT hook 总体步骤 代码案例分析方案预研面临的问题怎么做&#xff1f;ELFELF 文件头SHT&#xff08;section header table&#xff09; 链接视图&#xff08;Linking View&#xff09;和执行视图&#xff08;Execution View&…

Vue使用高德地图定位到当前位置,并显示天气信息

首先得去高德控制台申请两个 key&#xff0c;一个天气key和一个定位key 获取天气信息的函数&#xff1a; const getWeather function (city) {// 使用 fetch 发送请求获取天气信息fetch(https://restapi.amap.com/v3/weather/weatherInfo?city${city}&keyeefd36557b0250…

二,几何相交----2,区间相交检测IID--(1)算法

对于空间的线段是否相交&#xff0c;假设都是与x平行&#xff0c;则需要三步 1&#xff0c;对各线段左右端点设置为L,R标志 2&#xff0c;从小到大进行排序 3&#xff0c;线性扫描&#xff0c;从小到大&#xff0c;根据模式判断是否相交&#xff0c;假设不相交&#xff0c;则应…

【JavaScript】面试手撕浅拷贝

【JavaScript】面试手撕浅拷贝 引入 浅拷贝和深拷贝应该是面试时非常常见的问题了&#xff0c;为了能将这两者说清楚&#xff0c;于是打算用两篇文章分别解释下深浅拷贝。 PS: 我第一次听到拷贝这个词&#xff0c;有种莫名的熟悉感&#xff0c;感觉跟某个英文很相似&#xff…

sc-MAVE

Deep-joint-learning analysis model of single cell transcriptome and open chromatin accessibility data单细胞转录组和开放染色质可及性数据的深度联合学习分析模型 在同一个细胞中同时分析转录组和染色质可及性信息为了解细胞状态提供了前所未有的解决方案。然而&#x…

WPS/Office 好用的Word插件-查找替换

例如&#xff1a;一片文档&#xff1a;…………泰山…………泰&#xff08;少打了山字&#xff09;………… 要是把“泰”查找替换为“泰山”&#xff0c;就会把前面的“泰山”变成“泰山山”&#xff0c;这种问题除了再把“泰山山”查找替换为“泰山”&#xff0c;有没有更简单…

Flutter输入框换行后自适应高度

Flutter输入框换行后输入框高度随之增加 效果 设计思想 通过TextEditingController在build中监听输入框&#xff0c;输入内容后计算输入框高度然后自定义适合的值&#xff0c;并且改变外部容器高度达到自适应高度的目的 参考代码 //以下代码中的值只适用于案例&#xff0c;…

智能果园风吸杀虫灯的优势

TH-FD2随着农业科技的不断进步&#xff0c;果园管理也迎来了革命性的变革。智能果园风吸杀虫灯作为一种新型的果园管理工具&#xff0c;以其独特的优势&#xff0c;正逐渐受到广大果农的青睐。 一、智能果园风吸杀虫灯的工作原理 智能果园风吸杀虫灯利用害虫的趋光性&#xff0…

贪心 Leetcode 134 加油站

加油站 Leetcode 134 学习记录自代码随想录 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时油…

MonkeyRunner在自动化测试里的应用场景!

MonkeyRunner是Android提供的一个自动化测试工具&#xff0c;主要用于对Android设备或模拟器进行功能和压力测试。以下是一些MonkeyRunner在自动化测试中的应用场景及实例代码&#xff1a; 基本操作测试 点击屏幕上的特定位置或元素。 模拟滑动和手势操作。 发送按键事件。 …

指针习题二

使用函数指针实现转移表 #include <stdio.h> int add(int a, int b) {return a b; } int sub(int a, int b) {return a - b; } int mul(int a, int b) {return a * b; } int div(int a, int b) {return a / b; } int main() {int x, y;int input 1;int ret 0;int(*p[…

Linux学习:初识Linux

目录 1. 引子&#xff1a;1.1 简述&#xff1a;操作系统1.2 学习工具 2. Linux操作系统中的一些基础概念与指令2.1 简单指令2.2 ls指令与文件2.3 cd指令与目录2.4 文件目录的新建与删除指令2.5 补充指令1&#xff1a;2.6 文件编辑与拷贝剪切2.7 文件的查看2.8 时间相关指令2.9 …

服务器硬件基础知识

1. 服务器分类 服务器分类 服务器的分类没有一个统一的标准。 从多个多个维度来看服务器的分类可以加深我们对各种服务器的认识。 N.B. CISC: complex instruction set computing 复杂指令集计算 RISC: reduced instruction set computer 精简指令集计算 EPIC: explicitly p…

ViTMatte:Boosting image matting with pretrained plain vision transformers

自sora之后&#xff0c;我也要多思考&#xff0c;transformer的scaling law在各个子领域中是不是真的会产生智能&#xff0c;conv的叠加从resnet之后就讨论过&#xff0c;宽或者深都没有办法做到极限&#xff0c;大概sam这种思路是最好的实证。 1.introduction 引入了ViT adap…

浅谈一个CTF中xss小案例

一、案例代码 二、解释 X-XSS-Protection: 0&#xff1a;关闭XSS防护 之后get传参&#xff0c;替换过滤为空&#xff0c;通过过滤保护输出到img src里面 三、正常去做无法通过 因为这道题出的不严谨所以反引号也是可以绕过的 正常考察我们的点不在这里&#xff0c;正常考察…