zoukankan      html  css  js  c++  java
  • 函数 qsort 和 bsearch 的用法(poj2503)

    c函数qsort()和bsearch()的用法
    使用qsort()排序 并 用 bsearch()搜索是一个比较常用的组合,使用方便快捷。
    qsort 的函数原型是void __cdecl qsort ( void *base, size_t num, size_t width, int (__cdecl *comp)(const void *, const void* ) )
    
    其中base是排序的一个集合数组,num是这个数组元素的个数,width是一个元素的大小,comp是一个比较函数。
    
    比如:对一个长为1000的数组进行排序时,int a[1000]; 那么base应为a,num应为 1000,width应为 sizeof(int),comp函数随自己的命名。
    
    qsort(a,1000,sizeof(int ),comp);
    
    其中comp函数应写为:
    
    int comp(const void *a,const void *b)
    {
    return *(int *)a-*(int *)b;
    }
    
    是对一个二维数组的进行排序:
    
    int a[1000][2]; 其中按照a[i][0]的大小进行一个整体的排序,其中a[i][1]必须和a[i][0]一起移动交换。
    
    qsort(a,1000,sizeof(int)*2,comp);
    
    int comp(const void *a,const void *b)
    {
    return ((int *)a)[0]-((int *)b)[0];
    }
    
    对字符串进行一个排序:
    
    char a[1000][20];
    
    qsort(a,1000,sizeof(char)*20,comp);
    
    int comp(const void *a,const void *b
    {
    return strcmp((char *)a,(char *)b);
    }
    
    对一个结构体进行排序:
    
    typedef struct str
    {
    char str1[11];
    char str2[11];
    }str,*stri;
    str strin[100001]={0};
    
    int compare(const void *a,const void *b)
    {
    return strcmp( ((str*)a)->str2 , ((str*)b)->str2 );
    } 
    
    qsort(strin,total,sizeof(str),compare);
    
    而关于bsearch() ,他和qsort的用法基本一样,只是他的返回值是一个指向找到的单位元素的一个指针,另外他多了一个参数,是一个指向查找元素的一个指针。
    
    比如:从上面例子中的结构体数组中查找一个字符串:
    
    str *locate;
    char buffer[30]="abc";
    locate=(str*)bsearch(buffer,strin,total,sizeof(str),com);
    
    int com(const void *a,const void *b)
    {
    return strcmp( (char*)a, ((str*)b)->str2 );
    } 
    
    poj2503 http://poj.org/problem?id=2503
    /*此题还应注意的地方是字典输入的结束设置,希望能提出更好的解决方法(测试通过后再告诉我)。
    例题源代码:*/
    #include<iostream>
    #include<cstring>
    using namespace std;
    typedef struct str{
    char s1[11];
    char s2[11];
    }str,*stri;
    str s[100001];
    int cmp(const void *a,const void *b){
    return strcmp( ((str *)a)->s2 , ((str *)b)->s2 );
    }
    int compare(const void *a,const void *b){
    return strcmp((char*)a,((str*)b)->s2);
    }
    int main(){
    int n=0;
    char tt[25];
    while(1){
    
    gets(tt);
    if(strlen(tt)==0)break;
    int i=0,j=0;
    for(;tt[i]!=' ';i++)s[n].s1[i]=tt[i];
    s[n].s1[i]='';
    for(i++;tt[i]!='';i++,j++)s[n].s2[j]=tt[i];
    s[n].s2[j]='';
    n++;
    }
    qsort(s,n,sizeof(str),cmp);
    while(scanf("%s",tt)!=EOF){
    str * pItem;
    pItem = (str *)bsearch (tt, s, n, sizeof (str), compare);
    if(pItem!=NULL)
    puts(pItem->s1);
    else printf("eh
    ");
    }
    return 0;
    }


    www.cnblogs.com/tenlee
  • 相关阅读:
    使用Apache Commons-email邮件客户端发邮件
    Jfinal开发代码碎片_导出报表_配置druid数据源_使用guava_获取当前操作系统_JDK版本_jfinal-utils_jfinal验证码
    Memcached缓存集群_创建多实例
    HttpClient取得自定义的状态码302,并获取Header中的参数Location
    对象序列化和反序列化
    【校园电子书城】测试及部署
    mysql导入txt文件
    【校园电子书城】部分代码及数据库设计
    【校园电子书城】需求分析
    Domain logic approaches
  • 原文地址:https://www.cnblogs.com/tenlee/p/4420151.html
Copyright © 2011-2022 走看看