C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C 语言中qsort函数

C 语言中qsort函数介绍与正确使用

作者:晴天的雨.992

qsort是C语言中的一个库函数,它是基于快速排序算法实现的一个排序函数,qsort函数最大的特点就是它可以排任意类型的数据,这篇文章主要介绍了C 语言中qsort函数介绍与正确使用的相关资料,需要的朋友可以参考下

前言

qsort 是 C 标准库 <stdlib.h> 中提供的通用排序函数,可以对任意类型的数组进行排序(通常内部使用快速排序,但标准并未规定具体算法)。

1. 函数原型

#include <stdlib.h>

void qsort(void *base, size_t nmemb, size_t size,
           int (*compar)(const void *, const void *));

参数说明

参数含义
base指向待排序数组首元素的指针(void * 可接受任意类型)
nmemb数组中元素的个数
size每个元素的字节大小(通常写 sizeof(元素类型))
compar比较函数的函数指针

返回值

无返回值,排序结果直接写回 base 指向的数组。

2. 比较函数

比较函数是 qsort 的核心,签名必须是:

int compar(const void *a, const void *b);

它需要比较 a、b 指向的两个元素,返回值约定如下:

在比较函数内部,通常需要先把 void * 强制转换为实际元素类型。

3. 使用示例

3.1 排序整数数组

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

int cmp_int(const void *a, const void *b) {
    int ia = *(const int *)a;
    int ib = *(const int *)b;
    return (ia > ib) - (ia < ib);   /* 避免 ia - ib 溢出 */
}

int main(void) {
    int arr[] = {5, 2, 9, 1, 5, 6};
    size_t n = sizeof(arr) / sizeof(arr[0]);

    qsort(arr, n, sizeof(int), cmp_int);

    for (size_t i = 0; i < n; i++)
        printf("%d ", arr[i]);
    printf("\n");
    return 0;
}

注意:不要写成 return *(int*)a - *(int*)b;,当两个数相差很大时可能发生整数溢出,导致比较结果错误。

3.2 排序结构体数组

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

typedef struct {
    char name[32];
    int  age;
} Person;

/* 先按年龄升序,年龄相同按姓名升序 */
int cmp_person(const void *a, const void *b) {
    const Person *pa = (const Person *)a;
    const Person *pb = (const Person *)b;

    if (pa->age != pb->age)
        return (pa->age > pb->age) - (pa->age < pb->age);
    return strcmp(pa->name, pb->name);
}

int main(void) {
    Person people[] = {
        {"Alice", 30},
        {"Bob",   25},
        {"Carol", 30},
        {"Dave",  20},
    };
    size_t n = sizeof(people) / sizeof(people[0]);

    qsort(people, n, sizeof(Person), cmp_person);

    for (size_t i = 0; i < n; i++)
        printf("%s (%d)\n", people[i].name, people[i].age);
    return 0;
}

3.3 排序字符串指针数组

int cmp_str(const void *a, const void *b) {
    /* 数组元素是 char*,所以 a、b 实际是 char** */
    const char *const *sa = (const char *const *)a;
    const char *const *sb = (const char *const *)b;
    return strcmp(*sa, *sb);
}

int main(void) {
    const char *words[] = {"banana", "apple", "cherry", "date"};
    size_t n = sizeof(words) / sizeof(words[0]);

    qsort(words, n, sizeof(char *), cmp_str);

    for (size_t i = 0; i < n; i++)
        printf("%s\n", words[i]);
    return 0;
}

这是新手最常出错的地方:字符串数组的元素类型是 char *,所以传给比较函数的是 char **。

4. 复杂度与特性

5. 注意事项与常见陷阱

6. 小结

qsort 通过 void * + 函数指针实现了对任意类型的通用排序,是 C 语言中“泛型编程”的经典范例。使用时记住三点:正确传入元素个数与元素大小、正确编写比较函数、注意整数溢出与类型转换,就能应对绝大多数排序场景。

到此这篇关于C语言中qsort函数介绍与正确使用的文章就介绍到这了,更多相关C 语言中qsort函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文