📜  C语言中qsort()的比较器函数(1)

📅  最后修改于: 2023-12-03 14:40:27.400000             🧑  作者: Mango

C语言中qsort()的比较器函数

在 C 语言中,qsort() 函数可以用来对数组进行排序。而为了进行排序,我们需要提供一个比较器函数来判断一个元素是否应该排在另一个元素之前。本文将介绍如何编写 qsort() 的比较器函数。

什么是比较器函数

比较器函数是一个用来比较两个元素的函数,其返回值表示两个元素之间的大小关系。在 qsort() 中,每次需要排序时,都会用比较器函数来比较两个元素的大小,从而决定它们在排序后的位置。

比较器函数需要返回一个整数值,其具体含义如下:

  • 如果第一个元素比第二个元素小,则返回负数;
  • 如果第一个元素和第二个元素相等,则返回 0;
  • 如果第一个元素比第二个元素大,则返回正数。

例如,我们想要对一个存储了字符串的数组进行排序,我们可以编写如下的比较器函数:

int cmp_func(const void* a, const void* b)
{
    const char* str_a = *(const char**)a;
    const char* str_b = *(const char**)b;
    return strcmp(str_a, str_b);
}

这个比较器函数采用了标准库函数 strcmp(),用来比较两个字符串的大小。在主程序中,我们可以这样调用 qsort():

char* arr[] = {"apple", "banana", "orange", "pear"};
qsort(arr, 4, sizeof(char*), cmp_func);

这个调用语句会将字符串数组 arr 按字典序排序。

如何编写比较器函数

比较器函数的具体实现取决于我们要排序的元素的类型。在这里,我们用一个例子来进行说明。

我们想要对一个存储了结构体的数组进行排序,结构体包含两个字段:一个整数和一个字符串。我们希望对整数进行升序排序,对字符串进行降序排序。可以编写如下的比较器函数:

struct data {
    int number;
    char* str;
};

int cmp_func(const void* a, const void* b)
{
    const struct data* da_a = (const struct data*)a;
    const struct data* da_b = (const struct data*)b;

    if (da_a->number != da_b->number) {
        return da_a->number - da_b->number;
    }
    else {
        return strcmp(da_b->str, da_a->str);
    }
}

在这个比较器函数中,我们首先将传入的指针转换为结构体指针,然后分别取出结构体中的字段。接下来,如果两个元素的整数字段不相等,就返回它们之间的差值;否则,就用标准库函数 strcmp() 比较它们的字符串字段,返回相应值。

总结

在本文中,我们讲解了如何编写 qsort() 的比较器函数。我们学习了比较器函数的返回值含义以及如何在不同情况下编写比较器函数。无论是对于字符串、整数还是其他自定义类型,合理编写比较器函数可以使我们更轻松地使用 qsort() 进行排序。