对于qsort()函数的描述,stdlib.h的描述很有意思:
void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
void* base表示的是:任何形式的数组,int*,char*,float*都可以,任何指针都可以赋给void*
size_t num表示的是:size_t其实就是int的意思,这里需要你定义出这个数组的长度
size_t width表示的是:sizeof(你定义的这个数组的类型),比如sizeof(int)
int(__cdecl*compare)(const void*,const void*)表示的是:这是一个返回类型为int,函数名字为compare,其中两个参数都为const void*类型的函数
下面我来编写一个实例来演示这个qsort如何使用:
void print(int a[],int n) { for(int i=0;i<n;i++) printf("%d\t",a[i]); } int compare(const void *a,const void *b) { int *a1=(int *)a;//因为a为void*类型,需要把其转换成int*类型 int *b1=(int *)b;//因为b为void*类型,需要把其转换成int*类型 int num1=*a1;//将a1的值赋给num1 int num2=*b1;//将b1的值赋给num2 return num1-num2;//返还出num1于num2的差 } int main(){ int a[8]={8,5,6,1,2,4,7,3}; int n=8; qsort(a,n,sizeof(int),compare); print(a,n); }
实际上,如果你理解列compare函数,其实可以把compare函数写的很简单
int compare(const void *a,const void *b) { return *((int *)a)-*((int *)b); }
这里必须要强调的是compare函数一定是要返还int类型,这个是stdlib.h规定好了的,所以一定要按上述的要求定义函数,决对不能更改!
void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
这里挖一个坑,如果我定义一个float数组,那么这个数组是如何qsort()来求解呢?下回讲解。
除了qsort以外,stdlib还有一个有意思的查找函数bsearch(),下次也抽时间讲解。