概要
本篇博客将详细地介绍
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 函数的原型如下:
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 *)
:指向一个比较函数的指针,该函数用于确定两个元素的排序顺序。
- 比较函数
比较函数是一个用户定义的函数,它决定了排序的顺序。
比较函数的原型如下:
int compare(const void *e1, const void *e2);
const void *e1
和const void *e2
:指向要比较的两个元素的指针。
- 比较函数的返回值:
1、如果返回值小于 0,则 a 会被排在 b 前面。
2、如果返回值等于 0,则 a 和 b 的相对位置不变(但具体实现可能不同,有的实现会交换它们的位置)。
3、如果返回值大于 0,则 a 会被排在 b 后面。
(2) 使用(举例子 上代码)
- 假设我们有一个整数数组,并希望使用
qsort
对其进行排序(升序)。以下是具体的步骤:
1、定义数组:
//定义一个整型的一维数组 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、定义比较函数:
//定义一个比较函数
int cmp_int(const void* e1, const void* e2)
{
return (*(int*)e1) - (*(int*)e2);
}
3、调用 qsort:
//调用 qsort 排序函数
qsort(arr, sz, sizeof(arr[0]), cmp_int);
4、输出结果:
写在一个 test.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