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
  • 相关阅读:
    函数要多小才够好——谈小函数之道
    vb.net 打字练习
    vb.net 打字练习
    vb.net 打字练习
    unsigned int 与 unsigned long 一样吗?
    epoll使用详解(精髓)
    论epoll的使用 高调coding,低调做人 C++博客
    学习使用epoll The time is passing ITeye技术网站
    ubuntu下sed命令详解 Dicky 开源中国社区
    分享:jquery遍历之children()与find()的区别
  • 原文地址:https://www.cnblogs.com/tenlee/p/4420151.html
Copyright © 2011-2022 走看看