C语言排序函数qsort( )

关于c语言排序的问题,以前我都是用冒泡排序或者快速排序,知道这几天,在杭电上面打ACM的时候,才发现又一种排序的函数,就是qsort();

qsort()括号里面有4个参数
第一个参数是将要排序的数组名array;
第二个参数是将要排序的数量n;
第三个参数是每个要排序的参数的大小xizeof(array[o]);
第四个参数是自己写的一个比较函数cmp;

前三个参数还是比较好搞的,但是最后一个参数就比较麻烦了。
一开始见到的题目就是让我排序一个int类型的数组,
那cmp就应该这样写

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

声明cmp的括号里面只能将参数写成const void*;
return部分的话,因为我们比较的是int类型的数组,所以要强制转换格式成为指向int的指针,然后再解引用;
然后a-b就是升序排列,b-a的话就是降序排列;

然后到后面的一题,就需要让我去排一个结构体

typedef struct{
    int a;
    int b;
}node;

node arrays[1007];

我们要按照a的降序排列这个结构体数组
在qsort()的参数方面有两点需要注意
① 第三个参数要写成sizeof(node);
因为排序的最小单位就是一个结构
② cmp的声明

int cmp(const void*x, const void*y)
{
    return ((*(node*)y).a) - ((*(node*))x).a);
}

因为我们排的是结构,所以要让参数强制转化格式为指向结构的指针,然后解引用做差;

当然之前我在别的博客上面看到说这个强制转化要在return前完成,但是我真的去写的时候,我的code::blocks总是给我报错,在我想砸电脑的时候,我试了一下参照排列int类型数组那样写cmp
把int换成结构体,结果居然就不报错了,而且完美AC了!!!

ACM题目:1052(排int类型数组);3177(排结构);
from HDU OJ;

猜你喜欢

转载自blog.csdn.net/Big_Head_/article/details/78163809