zoukankan      html  css  js  c++  java
  • 模板:qsort+bsearch应用

    (1)qsort:

    功 能: 使用快速排序例程进行排序
    头文件:stdlib.h
    用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
    参数: 1 待排序数组首地址
    2 数组中待排序元素数量
    3 各元素的占用空间大小
    4 指向函数的指针,用于确定排序的顺序
     
    (2)bsearch:
    用 法: void *bsearch(const void *key, const void *base, size_t nelem, size_t width, int(*fcmp)(const void *, const *));

    参数:
    第一个:要查找的关键字。
    第二个:要查找的数组。
    第三个:指定数组中元素的数目。
    第四个:每个元素的长度(以字符为单位)。
    第五个:指向比较函数的指针。
     
    功能: 函数用折半查找法在从数组元素buf[0]到buf[num-1] 匹配参数key。如果函数compare 的第一个参数小于第二个参数,返回负值;如果等于返回零值;如果大于返回正值。数组buf 中的元素应以升序排列。函数bsearch()的返回值是指向匹配项,如果没有发现匹配项,返回NULL
     
     1 struct STEP
     2 {
     3     int x;
     4     int y;
     5 };
     6 
     7 int cmp(const void *a,const void *b)
     8 {
     9     STEP step1 = *((STEP *)a);
    10     STEP step2 = *((STEP *)b);
    11     if(step1.x == step2.x) return step1.y - step2.y;
    12     else return step1.x - step2.x;
    13 }
    14 
    15 qsort(steps,n,sizeof(STEP),cmp);
    16 bsearch(&step,steps,n,sizeof(STEP),cmp);

    其中 step1.x - step2.x 表示升序排序,反之则降序排序

    补充:compare的写法

    七种qsort排序方法

    <本文中排序都是采用的从小到大排序>

    一、对int类型数组排序

    int num[100];

    Sample:

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

    qsort(num,100,sizeof(num[0]),cmp);

    二、对char类型数组排序(同int类型)

    char word[100];

    Sample:

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

    qsort(word,100,sizeof(word[0]),cmp);

    三、对double类型数组排序(特别要注意)

    double in[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;
    else return d->y - c->y;
    }

    qsort(s,100,sizeof(s[0]),cmp);

    六、对字符串进行排序

    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;
    }

    Code:

    1 int cmp(const void *a,const void *b)
    2 {
    3     LINE line1 = *((LINE *)a);
    4     LINE line2 = *((LINE *)b);
    5     
    6     if(line1.r == line2.r) return 0;
    7     else return line1.r > line2.r ? 1 : -1;
    8 }

    参考资料:

    http://baike.baidu.com/view/982231.htm

    http://baike.baidu.com/view/653958.htm

    http://blog.sina.com.cn/s/blog_48f85e1d0100nslz.html

  • 相关阅读:
    Java高级特性 第11节 JUnit 3.x和JUnit 4.x测试框架
    Java高级特性 第10节 IDEA和Eclipse整合JUnit测试框架
    Java高级特性 第9节 Socket机制
    Java面向对象和高级特性 项目实战(一)
    Java高级特性 第8节 网络编程技术
    Java高级特性 第7节 多线程
    二十一、字符串类的创建
    二十二、经典问题解析二
    二十一、C++中的临时对象
    二十、对象的销毁
  • 原文地址:https://www.cnblogs.com/mobileliker/p/3548870.html
Copyright © 2011-2022 走看看