1.引入
我们前面学习了一些常见的排序方法,比如冒泡排序等,但它仅局限于整型的排序,今天我们要介绍一个牛气哄哄的库函数qsort函数,这个函数可就厉害了,能排序任意类型数据,掌握后可谓受益终身,接下来让我们一起来学习这个牛牛的库函数吧。
2.应用
qsort函数一共设计四个参数,第一个参数是数组的地址,因为它要比较不同数据类型,所以它要有一个比较的入口,第二个参数是数组中元素的个数,第三个参数是数组的元素大小,第四个参数是最难的一个参数,他是一个函数指针,因为我们在这里需要提供一个函数,一个可以提供比较方法的函数。接下来,闲言少叙,书归正传,让我们来研究它的使用范例:
我们在这里要利用qsort函数来帮助我们比较数组中整型的大小,并排序:
#include <stdio.h>
//qosrt函数的使⽤者得实现⼀个⽐较函数
int int_cmp(const void * p1, const void * p2)
{return (*( int *)p1 - *(int *) p2);
}
int main()
{int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };int i = 0;qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof (int), int_cmp);for (i = 0; i< sizeof(arr) / sizeof(arr[0]); i++){printf( "%d ", arr[i]);}printf("\n");return 0; }
看见了吧,有了qsort函数的帮助,代码实现了大大的简化。有兴趣的也可以来研究一下下面,当数组中的元素为一个结构体时,我们又该如何使用qsort函数呢?
struct Stu //学⽣ {char name[20];//名字int age;//年龄
};
//假设按照年龄来⽐较
int cmp_stu_by_age(const void* e1, const void* e2)
{return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
//strcmp - 是库函数,是专⻔⽤来⽐较两个字符串的⼤⼩的
//假设按照名字来⽐较
int cmp_stu_by_name(const void* e1, const void* e2)
{return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
//按照年龄来排序
void test2()
{struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };int sz = sizeof(s) / sizeof(s[0]);qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);
}
//按照名字来排序
void test3()
{struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };int sz = sizeof(s) / sizeof(s[0]);qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
}
int main()
{test2();test3();return 0; }
当然,后面我们可以一起来研究qsort函数究竟是怎么实现的,那就看各位对我的支持了啦!mua