作者是一个新手小白,在学习指针的时候,老师讲到了解qsort函数,以下是我的学习与见解
首先qsort函数是一种库函数,是基于quick sort算法的快速排序算法;它的语法如下
void qsort(
void *base,
size_t number,
size_t width,
int ( *compare )(const void *, const void *)
);
根据msdn的介绍
参数
base
是指向待排序数组的基项的指针,
numbver元素中的数组大小width
元素大小(字节)compare;
指向用户提供的例程的指针比较两个数组元素,并返回指定它们关系的值。
例如下面一段代码,就是示范如何调用qsort函数;
int m[4}={1,2,3,4};
//
//
qsort(m,4,4,compare);
其中我们注意到qsort函数要调用compare函数,那么这就要用到我这一节学习的主要内容,函数指针,我们用一个函数指针来接受这个compare函数,不妨这个指针就定义为
int(*compare)(const viod*,const viod*);
我们注意到这里的函数指针指向的compare函数有两个形参,const viod*指针来接收,这是因为viod*指针能接受任何一种类型的指针,在compare函数中,我们进行强制类型转换,来转换成你想要比较的连个参数;
那么我们如何来书写compare函数呢,以下是作者的写的一种算法
int compare (const void* e1,const void* e2)
{
return *((int*)e1)-(*((int*)e2);/*此步骤旨在将e1,e2两个指针强制类型转换成为int型的指针,然后解
引用*/
}
为什么返回int,以下是qsort函数中对compare函数的约定;
比较函数返回值 | 说明 |
---|---|
< 0 | elem1 小于 elem2 |
0 | elem1 等效于 elem2 |
> 0 | elem1 大于 elem2 |
qsort函数十分的强大我们下面来比较一个结构体中的元素来感受一下
#include "stdio.h"
#include "stdlib.h"
struct stu{
char name;
int age;
char sex;
};
int compare_age(const void* age1,const void* age2)
{
return ((struct stu*)age2)->age-((struct stu*)age1)->age;
}
void test()
{
int i=0;
struct stu s[4]={{"xiaoming",99,"男"},{"xiaozhang",100,"女"},{"xiaohong",3,"男"},{"xiaogan",66,"女"}};
qsort(s,4,sizeof(s[0]),compare_age);
printf("年龄由大到小的排序为\n");
for (i=0;i<4;i++)
{
printf("%d ",s[i].age);
}
}
int main()
{
test();
return 0;
}
读者还可以比较其他元素类型的数据不过都大同小异,如有问题欢迎指正;