c语言qsort自定义排序
时间: 2025-05-12 21:27:19 浏览: 26
### C语言 `qsort` 函数自定义排序
在C语言中,`qsort` 是标准库 `<stdlib.h>` 提供的一个通用排序函数。它允许通过传递一个比较函数来实现自定义排序逻辑[^4]。
以下是使用 `qsort` 对整型数组进行升序排序的示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义比较函数:用于升序排序
int cmp_int_asc(const void* a, const void* b) {
return (*(int*)a - *(int*)b);
}
int main() {
int arr[] = {5, 2, 9, 1, 6};
int sz = sizeof(arr) / sizeof(arr[0]);
// 调用 qsort 进行排序
qsort(arr, sz, sizeof(int), cmp_int_asc);
// 输出排序后的结果
for (int i = 0; i < sz; i++) {
printf("%d ", arr[i]);
}
return 0;
}
```
上述代码实现了对整数数组 `[5, 2, 9, 1, 6]` 的升序排序[^1]。如果需要降序排序,则可以修改比较函数如下:
```c
int cmp_int_desc(const void* a, const void* b) {
return (*(int*)b - *(int*)a);
}
```
调用该比较函数时,会得到相反顺序的结果[^2]。
对于更复杂的数据类型(如结构体),可以通过调整比较函数中的逻辑来进行特定字段的排序。例如,假设有一个学生结构体,按成绩高低排序:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char name[50];
int score;
} Student;
// 按照分数降序排序
int cmp_student_by_score(const void* a, const void* b) {
return ((Student*)b)->score - ((Student*)a)->score;
}
int main() {
Student students[] = {
{"Alice", 85},
{"Bob", 92},
{"Charlie", 78}
};
int sz = sizeof(students) / sizeof(students[0]);
// 使用 qsort 排序
qsort(students, sz, sizeof(Student), cmp_student_by_score);
// 打印排序结果
for (int i = 0; i < sz; i++) {
printf("Name: %s, Score: %d\n", students[i].name, students[i].score);
}
return 0;
}
```
此代码展示了如何基于学生的分数对其进行降序排序。
#### 参数说明
- **base**: 待排序数据的起始地址。
- **nelem**: 数据项的数量。
- **width**: 单个数据项的大小(字节)。
- **Comp**: 用户定义的比较函数指针,返回值决定两个元素之间的相对位置关系。
---
### 注意事项
当编写比较函数时需要注意溢出风险。例如,在处理大数值差别的情况下,`(int)a - (int)b` 可能引发整数溢出问题。推荐改写为条件判断形式以提高安全性[^3]。
---
阅读全文
相关推荐


















