C语言标准库qsort与bsearch用法详解
C语言标准库提供了强大的通用排序与查找函数:qsort用于快速排序任意类型数组,bsearch用于有序数组的二分查找。本文将通过具体的C代码示例,解析这两个函数的参数含义、比较函数的编写逻辑以及在实际开发中的应用场景。
qsort 快速排序
qsort 是C语言标准库 <stdlib.h> 中提供的通用快速排序函数,支持对基本数据类型数组和结构体进行排序。其函数声明如下:
void qsort(void *base, size_t num, size_t size, int (*compar)(const void *, const void *))
各参数说明:
base:指向待排序数组首元素的指针。num:数组中元素的总个数。size:单个元素占用的内存字节数(通常使用sizeof(arr[0]))。compar:用户自定义的比较函数指针,决定了排序的逻辑。
第1步:理解比较函数
排序的核心在于如何判断两个元素的大小。qsort 要求比较函数接收两个 const void* 类型的参数,分别代表参与比较的两个元素地址。为了获取实际值,需要将其强转为对应的具体类型指针。
以整数数组从小到大排序为例,比较函数返回值的逻辑为:
- 若 a < b,返回负数(如 -1)。
- 若 a = b,返回 0。
- 若 a > b,返回正数(如 1)。
注意:直接做减法 *a - *b 在极端数值下可能导致溢出,严谨的做法是使用条件分支或标志位。
第2步:整型数组排序实战
以下代码演示了对整型数组进行升序排序的完整流程,图片展示了排序后的结果:
#include <stdio.h>
#include <stdlib.h>
// 定义比较函数
int compare(const void* a, const void* b) {
int* p = (int*)a;
int* q = (int*)b;
// 推荐写法:避免直接相减导致溢出,但基础教学中常用c-d
if(*p < *q) return -1;
else if(*p == *q) return 0;
else return 1;
}
int main() {
int arr[] = {1, 4, 5, 8, 2, 3};
int n = sizeof(arr)/sizeof(arr[0]);
// 调用qsort
qsort(arr, n, sizeof(arr[0]), compare);
// 输出结果
for(int i=0; i<n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
第3步:结构体排序
结构体排序同样遵循上述逻辑,只需在比较函数中将指针转换为结构体指针,并指定按照哪个成员变量进行比较即可。下图展示了针对结构体特定成员排序的效果:
第4步:浮点数与非递减排序细节
对于浮点数,直接使用减法判断大小会丢失精度(例如两数之差小于1时返回0,被视为相等)。此时应明确返回 1 或 -1:
若需降序排列,将返回值逻辑取反即可(即 b - a 的逻辑)。
// 浮点数降序比较参考
int compare_float(const void* a, const void* b) {
double da = *(double*)a;
double db = *(double*)b;
if(da > db) return -1;
if(da < db) return 1;
return 0;
}
bsearch 二分查找
bsearch 是标准库中的二分查找函数。使用前有一个硬性前提:被搜索的数组必须是有序的,因此通常配合 qsort 一起使用。
第1步:函数签名
void *bsearch(const void *key, const void *base, size_t num, size_t size,
int (*compar)(const void *, const void *))
关键区别:
key:要查找的目标值(传递其地址)。- 返回值:
void*类型的指针。若找到,返回指向该元素的指针;若未找到,返回NULL。
第2步:代码实现与验证
以下代码展示了先排序后查找的完整流程。注意 bsearch
#include <stdio.h>
#include <stdlib.h>
// 复用之前的比较函数,或根据bsearch特性调整
int compare(const void* a, const void* b) {
int val_a = *(int*)a;
int val_b = *(int*)b;
if(val_a < val_b) return -1;
if(val_a == val_b) return 0;
return 1;
}
int main() {
int arr[] = {1, 4, 5, 8, 2, 3};
int n = sizeof(arr)/sizeof(arr[0]);
int key = 5;
// 1. 必须先排序
qsort(arr, n, sizeof(arr[0]), compare);
// 2. 准备查找目标(必须传地址)
int result = *(int*)bsearch(&key, arr, n, sizeof(int), compare);
// 这里简化了非空检查展示逻辑,实际开发中务必判空
printf("Found value: %d\n", result);
return 0;
}
以上就是C语言标准库函数 qsort 和 bsearch 的使用方法解析。掌握自定义比较函数是灵活应用这两个工具的关键。更多关于C/C++算法资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













