调用函数库中的快速排序算法qsort()排序各种数据类型

来源:互联网 发布:驱动人生网卡版无网络 编辑:程序博客网 时间:2024/04/29 19:45

快速排序算法已经有函数库提供给我们了,我们只要根据待排序的数据类型,重写cmp()这个接口函数就行了。下面是实例。

qsort()函数在stdlib.h库中

C语言中的qsort()函数原型为void __cdecl qsort ( void *base, size_t num, size_t width, int (__cdecl *comp)(const void *, const void* ) ) ;


Ø一、对int类型数组排序
Ø
Øint num[100];
Ø
ØSample:
Ø
Øint cmp ( const void *a , constvoid *b )
Ø
Ø{
Ø
Øreturn*(int*)a - *(int*)b;
Ø
Ø}
Ø
Øqsort(num,100,sizeof(num[0]),cmp);

Ø二、对字符进行排序
Øcharword[100];
Ø
ØSample:
Ø
Øint cmp( const void*a , const void*b )
Ø
Ø{
Ø
Øreturn*(char *)a - *(int *)b;
Ø
Ø}
Ø
Øqsort(word,100,sizeof(word[0]),cmp);
Ø
Ø
Ø三、对double类型数组排序(特别要注意)
Ø
Ødoublein[100];
Ø
Øint cmp( const void*a , const void*b )
Ø
Ø{
Ø
Øreturn*(double *)a > *(double *)b ? 1 : -1;
Ø
Ø}
Ø
Øqsort(in,100,sizeof(in[0]),cmp);

Ø四、对结构体一级排序
Ø
Østruct In
Ø
Ø{
Ø
Ødouble data;
Ø
Øint other;
Ø
Ø}s[100]
Ø
Ø//按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很
Ø多种,参考上面的例子写
Ø
Øint cmp( const void*a ,const void*b)
Ø
Ø{
Ø
Øreturn((In *)a)->data > ((In *)b)->data ? 1 : -1;
Ø
Ø}
Ø
Øqsort(s,100,sizeof(s[0]),cmp);
Ø五、对结构体二级排序
Ø
Østruct In
Ø
Ø{
Øint x;
Øint y;
Ø}s[100];
Ø
Ø//按照x从小到大排序,当x相等时按照y从大到小排序
Ø
Øint cmp( const void*a , const void*b )
Ø
Ø{
Ø
Østruct In*c = (In *)a;
Ø
Østruct In*d = (In *)b;
Ø
Øif(c->x!= d->x) return c->x - d->x;
Ø
Øelsereturn d->y - c->y;
Ø
Ø}
Ø
Øqsort(s,100,sizeof(s[0]),cmp);
Ø);
Ø
Ø六、对字符串进行排序
Ø
Østruct In
Ø
Ø{
Ø
Øint data;
Ø
Øcharstr[100];
Ø
Ø}s[100];
Ø
Ø//按照结构体中字符串str的字典顺序排序
Ø
Øint cmp ( const void *a , constvoid *b )
Ø
Ø{
Ø
Øreturnstrcmp( (*(In *)a)->str, (*(In *)b)->str );
Ø
Ø}
Ø
Øqsort(s,100,sizeof(s[0]),cmp
Ø七、计算几何中求凸包的cmp
Ø
Øint cmp(const void *a,const void *b) //重点cmp函数,把除了1点外的所有点,旋转
Ø角度排序
Ø
Ø{
Ø
Østruct point *c=(point *)a;
Ø
Østruct point *d=(point *)b;
Ø
Øif(calc(*c,*d,p[1])< 0) return 1;
Ø
Øelseif( !calc(*c,*d,p[1])&& dis(c->x,c->y,p[1].x,p[1].y) < dis(d->x,d->y,p
Ø[1].x,p[1].y))//如果在一条直线上,则把远的放在前面
Ø
Øreturn1;
Ø
Øelsereturn -1;
Ø
}