奇葩函数-qsort
非主流函数-qsort
qsort函数是C语言stdlib.h里面的一个快速排序函数。由于它不是C++的STL,所以它比C++的std :: sort跑的快的多
函数用法
函数原型
void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
使用方法
函数原型看不懂?我也看不懂。
简单来说,这个函数是这样用的。
这里面需要传进四个参数:需要排序的数组第一个元素的地址,总共需要排序的元素个数,每个元素的大小,比较函数。
举个例子:假设你有这样一个数组
int num[105];
你从num[1]输入到了num[100],现在需要给这些数据排序,怎么用呢?
qsort(num + 1, 100, sizeof(int), comp);//其中comp是你自己写的比较函数
比较函数
对于上面这个例子,我们的比较函数是这么写的
int comp(const void *a, const void *b) { return *(int*)a - *(int*)b; }
这个函数规定传进来的参数类型为const void*,返回值为int,这两点不可改变,以返回值的正负来判断两个函数的大小。详细来说,返回值为负就相当于告诉qsort函数前一个参数小于后一个参数。
不了解指针?那我们就事论事,说一下这个函数的通用写法。
- 假设我们需要排序的参数类型是type,传进来的参数分别为const void *x和const void *y
- 那么我们写作
*(type*)x
- 这样就相当于取出来了x自己的值
- 那么现在就可以这么写
-
int comp(const void *a, const void *b) { return *(type*)a < *(type*)b ? -1 : 1; }
- 就相当于让qsort从小到大排序。如果想要从大到小换成小于号即可
- 结构体排序?我们也可以用原来的办法取出结构体,然后正常返回
- 假设结构体名是Node,需要排序的参照成员名是mem,那么我们可以这么写
-
int comp(const void *a, const void *b) { return (*(Node*)a).mem < (*(Node*)b).mem ? -1 : 1; }
- 这样就相当于按照mem成员从小到大排序结构体了。
完整代码
P1177快速排序
#include <cstdlib> #include <cstdio> int num[100005]; int cmp(const void *a, const void *b) { return *(int*)a - *(int*)b; } int main() { int n; scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &num[i]); qsort(num + 1, n, sizeof(int), cmp); for (int i = 1; i <= n; i++) printf("%d ", num[i]); return 0; }