C语言标准库qsort与bsearch用法详解

程一诺
程一诺
发布时间:2026-10-16 | 7人浏览过
原创

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++算法资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表