qsort :超级打包工 你可以把qsort想象成一个**“超级打包工”**。它的绝活是能把一堆乱七八糟的东西数组排得整整齐齐。但它有个“怪癖”它力气很大能搬任何东西整数、小数、结构体但它不认识这些东西不知道谁大谁小。所以每次用它干活你都得配一个**“指导员”**比较函数告诉它“嘿这两个东西谁应该放前面”1. 怎么“雇佣”这个打包工函数原型要请qsort帮忙你得把话说全了一共要给它 4 个信息void qsort(void* base, size_t num, size_t size, int (*compar)(const void*, const void*));这 4 个参数翻译成人话就是base(基地)要排序的数组从哪儿开始传数组首地址。num(人数)一共有多少个元素要排size(体型)每个元素占多大内存比如int是 4 字节用sizeof(int)。compar(指导员)这是一个函数指针。你得把你自己写的比较函数的地址传给它。2. 怎么写“指导员”比较函数这是新手最容易晕的地方。qsort会拿着数组里的两个元素的地址去问你的“指导员”函数“这俩谁大”标准模板int cmp_function(const void* e1, const void* e2) { 你的逻辑 }核心规则死记硬背版如果e1比e2大返回正数( 0)。如果e1比e2小返回负数( 0)。如果e1等于e2返回0。要注意的是qsort是默认升序的。这就是为什么qsort函数的第四个参数的函数指针所指向的函数的返回类型是int实战技巧整型排序如果是排整数想从小到大排直接做减法最简单return *(int*)e1 - *(int*)e2;(注意这里必须先把void*强转成int*再解引用取值因为void指针不能解引用)3. 一个完整的栗子排序整数假设我们要把{ 9, 3, 5, 1 }排个序。#include stdio.h #include stdlib.h qsort 在这里面 第一步写个指导员函数从小到大 int int_cmp(const void* e1, const void* e2) { 强转类型然后做减法 return *(int*)e1 - *(int*)e2; } int main() { int arr[] { 9, 3, 5, 1 }; int sz sizeof(arr) / sizeof(arr[0]); 算出有4个元素 第二步雇佣 qsort 参数1数组名首地址 参数2元素个数 (4) 参数3单个元素大小 (4字节) 参数4比较函数的名字地址 qsort(arr, sz, sizeof(int), int_cmp); 打印看看 for(int i 0; i sz; i) { printf(%d , arr[i]); } 输出结果1 3 5 9 return 0; }4. 避坑指南重点void是个“瞎子”*qsort传给你的e1和e2都是void*类型。你不能直接对它们解引用比如*e1是错的也不能直接加减e11是错的。必须先“整容”强制类型转换比如你要比整数就得先写成(int*)e1然后再*(int*)e1取值。结构体怎么排如果数组里是学生结构体你想按年龄排。你的比较函数里就要把void*转成struct Stu*然后比较-age。return ((struct Stu*)e1)-age - ((struct Stu*)e2)-age;字符串类型的数据要用strcmp,详见strcmp介绍总结一下qsort负责干活搬运、交换你负责动脑写比较逻辑。只要你的比较函数写对了它就能帮你排任何数据