? 我们前面学习了一些常见的排序方法,比如冒泡排序等,但它仅局限于整型的排序,今天我们要介绍一个牛气哄哄的库函数qsort函数,这个函数可就厉害了,能排序任意类型数据,掌握后可谓受益终身,接下来让我们一起来学习这个牛牛的库函数吧。
? 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