qsort函数的基本用法和比较函数怎么写
嘿,先说说qsort这玩意儿到底咋用吧!qsort函数定义在C语言的stdlib.h里,排序效率杠杠的,时间复杂度一般是O(n log n),主要基于快速排序算法。用法超简单:
qsort(数组指针, 元素个数, 单个元素字节大小, 比较函数指针);
举个栗子,如果你有个整型数组a,长度1000,然后想升序排序,可以这么写:
int comp(const void *a, const void *b) {
return *(int *)a - *(int *)b;
}
qsort(a, 1000, sizeof(int), comp);
如果想降序排序,只要反过来写返回值就成了:
return *(int *)b - *(int *)a;
对于二维数组,比如int a[1000][2],如果你想根据第一列排序,比较函数要稍微复杂点,想象成比较a[i][0]和a[j][0]哇。

结构体多关键字排序如何实现 qsort和std::sort性能到底咋样
说完基础,我们来聊更高级点的——当你要用qsort给结构体数组排个序,而且不止一个关键字,比如:
struct Node {
int x;
int y;
} s[100];
你想先按x从小到大排,碰到x相同,再按y从大到小,这得怎么写比较函数呢?来,重点来了:
- 首先用
const void *强制转换成结构体指针。 - 按x比较,如果x不相等直接返回差值;
- 如果x相等,就按y比较,但这次得反过来实现降序(比如
return c2->y - c1->y;)。
示范代码像这样:
int Comp(const void *p1, const void *p2) {
struct Node *c1 = (struct Node *)p1;
struct Node *c2 = (struct Node *)p2;
if (c1->x != c2->x) return c1->x - c2->x;
return c2->y - c1->y;
}
qsort(s, 100, sizeof(s[0]), Comp);
超实用!
再说说qsort和C++的std::sort性能对比,这也是很多人关心的。其实吧,不能简单说谁快谁慢,因为:
- qsort底层用的是纯快速排序,平时速度挺快,但最糟糕情况是O(n²),可能会翻车。
std::sort厉害点,它用内省排序(introsort),综合了快速排序、堆排序和插入排序的优点,更稳定,更快。
所以,如果你有机会用C++的std::sort,尤其面对大数据,通常它表现更棒,不过qsort的兼容性和通用性还是很厉害的。

相关问题解答
- qsort比较函数为什么要用
const void *指针而不是直接用具体类型?
哦,这个嘛,qsort设计得特别通用,所以比较函数接收的都是const void *,这样它才能处理任何类型的数组。你要用的时候,得自己手动强制类型转换成你想比较的类型,有点麻烦但也很灵活。简单来说,就是“万能接口”,你看懂这点就轻松多了!
- 我用qsort排序结构体数组,多个字段排序写复杂了,咋保证没写错?
哎呀,别着急,写多关键字比较函数其实有套路!你只要记住:先比较主要关键字,如果不等直接返回结果;如果相等再比较次要关键字,依次类推。还有一个小秘诀,就是你可以先写个打印语句调试,保证比较结果符合预期,多简单啊!另外,谨记注意升序降序的return顺序很关键。
- C语言qsort和C++ std::sort,哪个更适合新手快速排序?
就新手角度来说,qsort更加“傻瓜式”,写法死板统一,能快速理解排序的核心;std::sort则更灵活,语法更现代,但要了解泛型和函数对象(lambda),有点小曲线救国的意思。所以,如果你正是刚入门,C的qsort绝对是稳稳的第一步。
- qsort在极端情况下会不会出现性能瓶颈?
额,是有可能发生的。qsort底层是快速排序,最坏情况时间复杂度是O(n²),比如数组本来就是完全有序或者逆序时,排序效率会变差。不过,这种情况比较少见,平时用用啥的都挺溜。如果你真怕卡顿,C++的std::sort内省排序更稳妥!放心,用得溜就好!
新增评论