qsort函数详解+代码展示

文章目录

概要

本篇博客将详细地介绍qsort排序函数,(C语言中内置的库函数)
qsort排序函数可以排序任意的数据类型,
如:整型(int)、结构体(struct)、浮点型(float)......
只要你写出比较函数,并将比较函数的地址传递给qsort函数的第四个参数-- 函数指针(int(*cmp)(void*e1,void* e2)

系列文章目录

🎈 🎈 我的CSDN主页 :OTWOL的主页,欢迎!!!👋🏼👋🏼

🎉🎉我的C语言初阶合集C语言初阶合集,希望能帮到你!!!😍 😍

🔍🔍我的C语言进阶合集我的C语言进阶合集,期待你的点击!!!🌈🌈

👋🏼🎉🎊创作不易,欢迎大家留言、点赞加收藏!!! 🥳😁😍

前言

qsort 是 C 语言标准库中的一个通用排序函数,
定义在 <stdlib.h> 头文件中。
它能够对任意类型的数组进行排序,只要提供适当的比较函数。
下面我将从定义、使用和注意事项三个方面详细讲解 qsort函数。

(1) 定义

  • qsort 函数的原型如下:
c 复制代码
void qsort(void* base, size_t num, size_t size, int (*compar)(const void *, const void *));

void *base:指向要排序的数组的起始地址。
size_t num:数组中元素的个数。
size_t size:数组中每个元素的大小(以 字节 为单位)。
int (*compar)(const void *, const void *):指向一个比较函数的指针,该函数用于确定两个元素的排序顺序。


  • 比较函数

比较函数是一个用户定义的函数,它决定了排序的顺序。

比较函数的原型如下:

c 复制代码
int compare(const void *e1, const void *e2);

const void *e1const void *e2:指向要比较的两个元素的指针。

  • 比较函数的返回值:

1、如果返回值小于 0,则 a 会被排在 b 前面。
2、如果返回值等于 0,则 a 和 b 的相对位置不变(但具体实现可能不同,有的实现会交换它们的位置)。
3、如果返回值大于 0,则 a 会被排在 b 后面。

(2) 使用(举例子 上代码)

  • 假设我们有一个整数数组,并希望使用 qsort 对其进行排序(升序)。以下是具体的步骤:
1、定义数组:
c 复制代码
//定义一个整型的一维数组 arr,里面存放着 9,8,7,6,5,4,3,2,1,0 
// 一共有 10 个元素
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
2、定义比较函数:
c 复制代码
//定义一个比较函数
int cmp_int(const void* e1, const void* e2)
{
	return (*(int*)e1) - (*(int*)e2);
}
3、调用 qsort:
c 复制代码
//调用 qsort 排序函数
qsort(arr, sz, sizeof(arr[0]), cmp_int);
4、输出结果:

写在一个 test.c 的源代码中:

c 复制代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

//定义一个比较函数
int cmp_int(const void* e1, const void* e2)
{
	//返回 e1 和 e2 指针所指向的元素的 差值
	return (*(int*)e1) - (*(int*)e2);
}

//定义一个输出打印的函数
void Print(int arr[], int sz)
{
	int i = 0;
	//输出
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	//换行
	printf("\n");
}

void test1()
{
	//定义一个整型的一维数组 arr,里面存放着 9,8,7,6,5,4,3,2,1,0 
	// 一共 10 个元素
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	//求数组的大小
	int sz = sizeof(arr) / sizeof(arr[0]);
	//打印提示信息
	printf("排序前:\n");
	//调用函数 - 输出
	Print(arr, sz);
	//调用 qsort 排序函数(升序)
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	//打印提示信息
	printf("排序后:\n");
	//调用函数 - 输出
	Print(arr, sz);
}

int main()
{
	//调用函数
	test1();

	return 0;
}
  • 输出结果:

(3) 注意事项

1、类型转换:

在比较函数中,需要将 void* 类型的指针转换为适当的类型(如 int*),然后 解引用 以获取实际的值。

2、数组边界:

确保传递给 qsort 的数组大小和每个元素的大小是正确的。

3、稳定性:

qsort 不保证排序的稳定性(即,如果两个元素相等,它们在排序后的相对位置可能会改变)。
如果需要稳定排序,可能需要使用其他算法或库。

4、性能:

qsort 通常使用快速排序算法,平均时间复杂度为 O(n log n)
但在最坏情况下(如数组已经有序或完全逆序)时间复杂度为 O(n^2)

5、线程安全:

在多线程环境中使用 qsort 时,需要确保传递给它的数组和比较函数在排序过程中不会被其他线程修改。

6、内存管理:

qsort 不会分配或释放内存,它只会在提供的数组上进行排序。

小结

熟练掌握qsort 函数的使用,可以让你在排序任意的数据类型,做到事半功倍,
因为,你只要将比较函数写好就行,其他的C语言库会帮你解决的!
但是也要注意使用时的注意事项哦!
如:函数的传参的类型,指针的强制类型转换等。

每天都在学习的路上!
On The Way Of Learning

相关推荐
沐知全栈开发8 分钟前
基于PyTorch的DDSP设计源码及C/C++实现分析
c++·pytorch·源码分析·ddsp·c/c++实现
《源码好优多》22 分钟前
基于Java Springboot华为数码商城交易平台
java·开发语言·spring boot
陈壮实的搬砖日记31 分钟前
一文看懂SE(Squeeze and Excitation)模块及代码实现
人工智能·深度学习·算法
康熙38bdc42 分钟前
Linux 线程互斥
linux·运维·开发语言
Mr__vantasy1 小时前
数据结构(初阶7)---七大排序法(堆排序,快速排序,归并排序,希尔排序,冒泡排序,选择排序,插入排序)(详解)
c语言·开发语言·数据结构·算法·排序算法
♡喜欢做梦1 小时前
【Java】二叉树:数据海洋中灯塔式结构探秘(下:基本操作)
java·数据结构·算法
机器视觉知识推荐、就业指导1 小时前
基于Qt实现的自定义树结构容器:设计与应用
开发语言·qt
草莓奶忻1 小时前
Ubuntu20.04运行R-VIO2
c++
qing_0406031 小时前
C++——多态(下)
开发语言·c++
花糖纸木1 小时前
算法练习:34. 在排序数组中查找元素的第一个和最后一个位置
数据结构·c++·算法·leetcode