C语言qsort函数用法详解与实例

Ada
Ada
发布时间:2026-10-14| 1人浏览过
原创

C语言的 stdlib.h 头文件中提供了通用的快速排序函数 qsort。掌握其核心原理——即通过自定义比较函数处理不同数据类型的 void 指针,能够高效解决从基础数组到复杂结构体的多种排序需求。

基本数据类型排序

qsort 的原型为:void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *))。其中 base 指向待排序数组的首地址,nitems 为元素个数,size 为单个元素的大小,compar 是指向比较函数的指针。以下示例均默认按从小到大排序。

第1步:整数数组(int)排序

比较函数需要将 void* 指针强转为 int* 进行取值,返回差值即可判断大小关系。

int num[100];

// 比较函数:返回 a - b 实现升序
int cmp_int(const void *a, const void *b) {
    return *(int *)a - *(int *)b;
}

// 调用排序
qsort(num, 100, sizeof(num[0]), cmp_int);

第2步:字符数组(char)排序

逻辑同整数,直接强转为 char*。注意 char 类型参与运算时可能会发生整型提升,但通常不会导致溢出问题。

char word[100];

int cmp_char(const void *a, const void *b) {
    return *(char *)a - *(char *)b;
}

qsort(word, 100, sizeof(word[0]), cmp_char);

第3步:浮点数数组(double)排序

浮点数不能直接使用减法判断大小(可能导致精度丢失或返回错误的符号),必须使用条件表达式明确返回 1 或 -1。

double in[100];

int cmp_double(const void *a, const void *b) {
    double da = *(double *)a;
    double db = *(double *)b;
    // 防止 NaN 情况下的未定义行为,常规实现如下:
    return (da > db) ? 1 : ((da == db) ? 0 : -1);
}

qsort(in, 100, sizeof(in[0]), cmp_double);

结构体排序进阶

当需要排序的对象是结构体时,比较函数内部需要先解引用指针获取结构体成员,再根据具体的字段进行逻辑判断。

第4步:结构体一级排序

仅依据结构体中的某个单一成员(如浮点型数据)进行排序。需先定义结构体,并在比较函数中将 void* 转换为结构体指针。

struct Info {
    double value;
    int id;
}s[100];

int cmp_struct_single(const void *a, const void *b) {
    struct Info *ia = (struct Info *)a;
    struct Info *ib = (struct Info *)b;
    // 同样建议使用条件判断而非直接相减
    return (ia->value > ib->value) ? 1 : ((ia->value == ib->value) ? 0 : -1);
}

qsort(s, 100, sizeof(s[0]), cmp_struct_single);

第5步:结构体二级排序

当主排序键相同,需要参考次排序键时。例如:优先按 x 升序,x 相等时按 y 降序排列。

struct Point {
    int x;
    int y;
}s[100];

int cmp_struct_double(const void *a, const void *b) {
    struct Point *pa = (struct Point *)a;
    struct Point *pb = (struct Point *)b;
    
    // 第一优先级:x 从小到大
    if (pa->x != pb->x) {
        return pa->x - pb->x;
    }
    // 第二优先级:y 从大到小
    else {
        return pb->y - pa->y;
    }
}

qsort(s, 100, sizeof(s[0]), cmp_struct_double);

第6步:结构体中字符串排序

若结构体包含字符数组,需利用 strcmp 函数比较字符串内容。strcmp 的返回值本身即可作为 qsort 的比较结果。

struct Record {
    int data;
    char str[100];
}s[100];

int cmp_string(const void *a, const void *b) {
    struct Record *ra = (struct Record *)a;
    struct Record *rb = (struct Record *)b;
    // 直接返回 strcmp 的结果:小于0则前者小,等于0则相等,大于0则后者大
    return strcmp(ra->str, rb->str);
}

qsort(s, 100, sizeof(s[0]), cmp_string);

以上就是 C 语言中 qsort 函数的详细使用方法,涵盖常用数据类型及结构体排序场景。更多关于 C 语言算法与标准库使用的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。