qsort函数,好用!
但是不能过度依赖,自己也得掌握一些排序方法
现在进行一些关于qsort函数的介绍
基本信息
头文件:
#include<stdlib.h>
qsort使用时的组成:
qsort(num, n, sizeof( ), cmp);
其中,num为数组名,n为要排序的元素个数(当然是从0到n - 1位置的元素),sizeof( )括号里填数据类型,其中cmp是函数名,是接下来要讲的
cmp函数的定义:
int cmp(const void * a,const void * b)
{
//函数内容
}
上面部分是这么定义的,而函数内容就关乎到大小的排序和需要排序的元素类型了
int cmp(const void * a,const void * b)
{
return * (int *) a - * (int *) b;
}
这是增序排列(即从小到大),即如果a > b所指地址上的数,返回正数就可以实现增序排列
想要降序反过来就可以
int cmp(const void * a,const void * b)
{
if(* (double *) a > * (double *) b)
return 1;
else
return -1;
}
//需要注意的是,因为浮点数存储的时候有误差,最好返回值由自己来写
其他类型的都可以自己类推,只要注意强制转换的改变就行
qsort对多维函数的排序
我做题的时候,往往困扰于想偷懒的时候,要排序的对象是二维数组,不会用qsort怎么办
在最近复习了指针之后,想到了一个使用qsort对多维数组排序的方法,发现居然可行,而且帮我一道题get到了满分
接下来以二维数组为例
假设有一二维数组:
num[1000][3]
现在需要根据其一维上的第二个元素进行增序排序
可以这么使用qsort:
qsort(num, 1000, 3 * sizeof(int), cmp);
int cmp(const void * a, const void * b)
{
return * ((int *) a + 1) - * ((int *) b + 1);
}
可以发现qsort中sizeof前面乘了一个3(一维上的元素个数)而返回值是根据指针的使用方法得到的一维上的第二个元素
如果熟悉指针的原理的话就可以看懂了
也可以进一步使用qsort
如,根据第二个元素进行降序排序,如果第二个元素相同的话,就根据第一个进行降序序排序,再相同就根据第三个:
qsort(num, 1000, 3 * sizeof(int), cmp);
int cmp(const void * a,const void * b)
{
if(* ((int *) a + 1) > * ((int *) b + 1))
return -1;
else if(* ((int *) a + 1) == * ((int *) b + 1))
if(* (int *) a > * (int *) b)
return -1;
else if(* (int *) a == * (int *) b)
return * ((int *) b + 2) - * ((int *) a + 2);
else
return 1;
else
return 1;
}
在cmp函数上做文章,就可以满足不同情况下的排序要求
好用!