C语言中的qsort函数详解及示例

需积分: 9 6 下载量 201 浏览量 更新于2024-12-15 收藏 23KB DOC 举报
"这篇文档详细介绍了C语言标准库中的`qsort`函数的使用方法,提供了从整型、字符型到结构体类型的排序示例,包括单级和二级排序的标准实现。" `qsort`函数是C语言标准库 `<stdlib.h>` 中的一个通用排序算法,用于对内存中的一段数据进行排序。它接受四个参数:待排序的数组起始指针、数组元素个数、每个元素的大小以及一个比较函数指针。`qsort`函数的核心在于自定义的比较函数,它定义了排序的标准。 1. **对整型数组排序**: 当我们需要对整型数组 `int num[100]` 进行排序时,可以编写一个名为 `cmp` 的比较函数,返回两个整数的差值,这样`qsort`会根据这个差值判断元素的相对顺序。示例代码如下: ```c int cmp(const void* a, const void* b) { return *(int*)a - *(int*)b; } qsort(num, 100, sizeof(num[0]), cmp); ``` 2. **对字符型数组排序**: 对于字符数组 `char word[100]` 的排序,可以使用与整型数组相同的比较函数,因为字符本质上也是整数类型。但是请注意,如果涉及到字符串排序,需要考虑字符串结束标志 '\0'。 3. **对浮点型数组排序**: 对于双精度浮点型数组 `double arry[100]`,`qsort`的比较函数需要处理浮点数的比较。这里需要注意浮点数大于或小于的判断,示例代码如下: ```c int cmp(const void* a, const void* b) { return (*(double*)a > *(double*)b) ? 1 : -1; } qsort(arry, 100, sizeof(arry[0]), cmp); ``` 4. **对结构体一级排序**: 当涉及到结构体数组排序时,比如一个结构体 `struct In` 包含一个 `double` 类型的数据成员 `data`,可以这样编写比较函数: ```c struct In { double data; int other; }; int cmp(const void* a, const void* b) { struct In* c = (In*)a; struct In* d = (In*)b; return c->data > d->data ? 1 : -1; } qsort(s, 100, sizeof(s[0]), cmp); ``` 5. **对结构体二级排序**: 如果结构体包含多个字段,例如 `struct In` 有 `int x` 和 `int y`,可以先按 `x` 排序,`x` 相等时按 `y` 排序: ```c struct In { int x; int y; }; int cmp(const void* a, const void* b) { struct In* c = (In*)a; struct In* d = (In*)b; if (c->x != d->x) return c->x - d->x; else return d->y - c->y; } qsort(s, 100, sizeof(s[0]), cmp); ``` 6. **对字符串进行排序**: 如果结构体中包含字符串字段,如 `struct In` 有一个 `char str[100]` 字符数组,可以使用 `strcmp` 函数进行字符串比较: ```c struct In { int data; char str[100]; }; int cmp(const void* a, const void* b) { struct In* c = (In*)a; struct In* d = (In*)b; return strcmp(c->str, d->str); } qsort(s, 100, sizeof(s[0]), cmp); ``` 总结,`qsort`函数的灵活性使得它可以适应各种类型的数据排序需求,只需要编写适当的比较函数即可。通过调整比较函数的逻辑,可以实现升序或降序排列,以及多级排序。然而,`qsort`不是最优的排序算法,对于大数据量的排序可能效率较低,更适合小规模数据的快速操作。在实际应用中,如果需要高效排序,可以考虑使用更先进的排序算法,如快速排序、归并排序等。