C语言 stdlib.h自带函数库:qsort()排序,简称"快排"

对于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(),下次也抽时间讲解。

posted @ 2020-06-22 20:54  雾漫大武汉  阅读(624)  评论(0编辑  收藏  举报