【C】关于qsort的使用

C++中有很方便很实用的函数sort,但是对于刚刚学习写C语言的人来说,可能会有一些障碍,所以写个博客来解释一下C中的排序函数qsort,之后也会另发博客来解释sort函数
本文仅用于给刚刚接触不久C语言的人解释qsort函数,各位大佬可以忽略本文

先上示例代码

//使用qsort函数(从小到大排序)
#include
#include

int n,i,a[10000];

int comp(const void *a,const void *b)
{
    if(*(int*)a>*(int*)b)return 1;
    else return -1;
}

int main()
{
    scanf("%d",&n);
    for (i=0; i<n; i++)
    {
        scanf("%d",&a[i]);
    }
    qsort(a, n, sizeof(int), comp);
    for (i=0; i<n; i++)
    {
        printf("%d ",a[i]);
    }
    return 0;
}

输入:

10
2 3 4 5 6 1 7 8 9 0

输出:

0 1 2 3 4 5 6 7 8 9 

qsort函数原型

//qsort位于头文件下
void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));

参数列表

void*base			//需要排序的数组首地址
size_t num			//需要排序的长度
size_t width			//每一个需要进行排序的元素的大小
int(__cdecl*compare)(const void*,const void*)//自己写的排序函数,输入的是两个void类型的指针

示例代码分析

示例中,要排序的数组为a,排序长度为n,每个元素都为int,所以大小为sizeof(int),使用的排序函数是自己写的comp函数。

关于“comp”函数写法

1、首先,这是一个int类型的函数,函数名可以自己取,参数列表为两个void类型的指针。(前面的const的意思是常量,关于为什么要加const,既然默认了看本文的以小白为主,那么在本文就不具体解释。不加const部分编辑器会报warning但不会error,不加也可以正常使用,但是为了解决强迫症的0 warning和0 error的目标,这里给出解决办法)
所以这个函数内,需要对这两个参数进行强制转换。(例如使用(int*)a这样的结构)
2、其次,输入的是指针,所以需要利用指针去取参数(示例中再对int类型的指针取值)
3、函数的返回值是int类型的值,具体的关于返回的值对排序的影响这里不做讨论,可以参照示例去写,情况只有返回值大于0返回值小于0返回值等于0三种情况,所以,可以把comp函数中的 “>” 改成 “<” 即可完成从大到小排序。当然也可以进一步缩减,使得函数直接返回a和b的差值。如下:

int comp(const void *a,const void *b)
{
    return (*(int*)a-*(int*)b);
}

当然,如果有能力使用sort的人,建议还是不要使用qsort函数。因为参数和自定义函数这么多

你可能感兴趣的:(【C】关于qsort的使用)