qsort函数怎么使用

来源:站长工具作者:石川澪头衔:网络博主
导读:本期聚焦于小伙伴创作的《qsort函数怎么使用》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《qsort函数怎么使用》有用,将其分享出去将是对创作者最好的鼓励。

qsort函数是C语言标准库stdlib.h中提供的通用排序接口,基于快速排序算法实现,支持对任意类型的数据集合进行排序,开发者只需要根据待排序数据的类型编写对应的比较逻辑即可,不需要自己实现排序的核心流程。

qsort函数怎么使用

qsort函数的基本语法

qsort的函数原型如下:

#include <stdlib.h>
void qsort(void *base, size_t nmemb, size_t size,
           int (*compar)(const void *, const void *));

各个参数的含义如下:

  • base:指向待排序数组首元素的指针,类型为void*,因此可以接收任意类型的数组首地址。
  • nmemb:数组中待排序元素的总个数,类型为size_t,是无符号整数类型。
  • size:数组中每个元素的大小,单位是字节,类型为size_t,可以通过sizeof运算符获取。
  • compar:指向比较函数的指针,这个比较函数需要开发者自己实现,用来定义两个元素的排序规则。

比较函数的编写规则

比较函数是qsort能够正确排序的核心,它的函数签名固定为接收两个const void*类型的参数,返回int类型的结果,规则如下:

  • 如果第一个参数指向的元素小于第二个参数指向的元素,返回负整数。
  • 如果第一个参数指向的元素等于第二个参数指向的元素,返回0。
  • 如果第一个参数指向的元素大于第二个参数指向的元素,返回正整数。

因为比较函数的参数是void*类型,所以需要在函数内部先将指针转换为待排序元素的实际类型,再进行取值比较。比如排序int类型数组时,比较函数需要先将两个void*指针转换为int*,再解引用取值。

不同类型数据的排序示例

1. 整型数组排序

对int类型数组进行升序排序的示例代码如下:

#include <stdio.h>
#include <stdlib.h>

// 整型比较函数,升序排序
int int_compare(const void *a, const void *b) {
    // 将void指针转换为int指针,再解引用取值
    int num1 = *(const int *)a;
    int num2 = *(const int *)b;
    // 返回差值,实现升序
    return num1 - num2;
}

int main() {
    int arr[] = {5, 2, 8, 1, 9, 3};
    int n = sizeof(arr) / sizeof(arr[0]);
    // 调用qsort排序
    qsort(arr, n, sizeof(int), int_compare);
    // 打印排序结果
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("n");
    return 0;
}

如果需要降序排序,只需要把比较函数的返回值改为num2 - num1即可。

2. 字符串数组排序

对字符串数组排序时,每个元素是char*类型,比较函数需要使用strcmp函数来比较两个字符串的大小,示例代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 字符串比较函数,按字典序升序
int str_compare(const void *a, const void *b) {
    // a和b是指向数组元素的指针,数组元素是char*,所以先转换为char**再解引用得到字符串地址
    const char *str1 = *(const char **)a;
    const char *str2 = *(const char **)b;
    // 使用strcmp比较字符串
    return strcmp(str1, str2);
}

int main() {
    char *arr[] = {"apple", "banana", "cherry", "date", "apricot"};
    int n = sizeof(arr) / sizeof(arr[0]);
    qsort(arr, n, sizeof(char *), str_compare);
    for (int i = 0; i < n; i++) {
        printf("%sn", arr[i]);
    }
    return 0;
}

3. 结构体数组排序

对结构体数组排序时,可以根据结构体的某个成员来定义排序规则,比如按照学生的分数升序排序,示例代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 定义学生结构体
typedef struct {
    char name[20];
    int score;
} Student;

// 按分数升序的比较函数
int student_compare(const void *a, const void *b) {
    const Student *s1 = (const Student *)a;
    const Student *s2 = (const Student *)b;
    return s1->score - s2->score;
}

int main() {
    Student students[] = {
        {"张三", 85},
        {"李四", 92},
        {"王五", 78},
        {"赵六", 90}
    };
    int n = sizeof(students) / sizeof(students[0]);
    qsort(students, n, sizeof(Student), student_compare);
    for (int i = 0; i < n; i++) {
        printf("姓名:%s,分数:%dn", students[i].name, students[i].score);
    }
    return 0;
}

使用qsort的注意事项

  • 比较函数的两个参数必须是const void*类型,不要直接传入具体类型的指针,否则会导致编译错误。
  • 计算返回值时,如果待排序的元素是有符号整数,且数值范围较大,直接用两个值相减可能会导致整数溢出,此时可以改用判断语句返回结果,比如:
int safe_int_compare(const void *a, const void *b) {
    int num1 = *(const int *)a;
    int num2 = *(const int *)b;
    if (num1 < num2) return -1;
    if (num1 > num2) return 1;
    return 0;
}
  • size参数必须是单个元素的真实字节大小,不要传错,否则会导致排序时内存访问越界,出现不可预期的错误。
  • qsort是不稳定排序,如果两个元素比较结果相等,它们的相对顺序在排序后可能会发生变化,如果需要稳定排序,需要自己实现对应的排序逻辑。

qsort排序算法回调函数void指针比较函数修改时间:2026-06-12 13:33:33

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。