C语言qsort函数用法详解与实例
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 语言算法与标准库使用的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













