C++中有很方便很实用的函数sort,但是对于刚刚学习写C语言的人来说,可能会有一些障碍,所以写个博客来解释一下C中的排序函数qsort,之后也会另发博客来解释sort函数
本文仅用于给刚刚接触不久C语言的人解释qsort函数,各位大佬可以忽略本文
先上示例代码
//使用qsort函数(从小到大排序)
#include<stdio.h>
#include<stdlib.h>
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位于<stdlib.h>头文件下
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函数。因为参数和自定义函数这么多