qsort 调用技巧

来源:互联网 发布:淘宝宝贝上架时间查询 编辑:程序博客网 时间:2024/05/29 03:53
//所在头文件 :stdlib.h//<本文中排序都是采用的从小到大排序>/*这里的原理是将值返回给qsort函数,比较函数返回大于0,qsort就认为 a>b , 如果比较函数返回等于0 qsort就认为a 和b 这两个元素相等,返回小于零 qsort就认为 a<b*/

0.主函数

   int main()        {            qsort(数组的首地址,需要排序的数量,sizeof(A[0]),cmp);            return 0;        }

1.对于int型数组进行排序

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

2.对于char型数组进行排序(其基本原理同int型数组排序)

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

3.对于double型数组进行排序(注意 double型不能偷懒返回a-b(因为a-b是double型)

    int cmp(const void *a ,const void *b)    {        return *(double *)a>*(double *)b?1:-1;    }

4.对于结构体数组一级进行排序

    typedef struct    {  int  data;  int  other; } name;//类似该结构体即可    name test[100];    int cmp(const void *a ,const void *b)    {        return (*(name *)a).data-(*(name *)b).data;    }//排序关键字就是data(注意若为浮点型关键字,请仿照double写返回值语句)

5.对于结构体数组二级进行排序

//基本原理是当第一个关键字相同时,利用第二个关键字比较name test[100];int cmp(const void *a ,const void *b){    name *M=(name* )a,N=(name* )a;    if(M->other!=N->other)        return other->m-N->other;    else        return M->data!=N->data;}}//(注意若为浮点型关键字,请仿照double写返回值语句)/*一般这个时候都在cmp函数里面先强制转换了类型,不要在return里面,这样程序会更清晰,并且绝对是没错的.*/6.对字符串进行排序

1.普通二维数组存放

        int cmp(const void*a,const void*b)        {            return strcmp((char *)a,(char *)b);        }     qsort(数组的首地址,需要排序的数量,sizeof(A[0]),cmp);
程序示例:
        #include <stdio.h>        #include <stdlib.h>        #include <string.h>        int cmp(const void*a,const void*b)        {            return -strcmp((char *)a,(char *)b);        }        char c[10][10];        int main()        {            int i,j;            for(i=5;i>=0;i--)                for(j=0;j<7;j++) c[i][j]=i+'A';            printf("排序前\n");            for(i=0;i<=5;i++) puts(c[i]);            qsort(c,6,sizeof(c[0]),cmp);            printf("排序后\n");            for(i=0;i<=5;i++) puts(c[i]);            return 0;        }
2.用结构体存储
    struct In { int data; char str[100]; }s[100];        //按照结构体中字符串str的字典顺序排序        int cmp ( const void *a , const void *b )        {return strcmp( (*(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;else if( !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))//如果在一条直线上,则把远的放在前面        return 1;else return -1;}
0 0
原创粉丝点击