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]='\0';
for(i++;tt[i]!='\0';i++,j++)s[n].s2[j]=tt[i];
s[n].s2[j]='\0';
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\n");
}
return 0;
}