ubuntu,debian,redhat,fedora,centos
« »

排序与查找函数(qsort,bsearch,alphasort)

qsort函数声明如下:

  1. void qsort(void *base, size_t nmemb, size_t size,
  2.                   int(*compar)(const void *, const void *));

参数说明如下:
base: 要排序的数组
nmemb: 数组中的元素数目 sizeof(array)/sizeof(array[0])
size: 每个数组元素占用内存空间,可使用sizeof(array[0])获得
compar: 比较两个数组元素的比较函数。本比较函数的第一个参数值小于、等于、大于第二参数值时,本比较函数的返回值应分别小于、等于、大于零。


bsearch函数声明如下:

  1. void *bsearch(const void *key, const void *base, size_t *nelem,
  2. size_t width, int(*fcmp)(const void *, const *));

参数的意思和qsort的差不多,区别在于:
1. qsort用来排序,bsearch用二分法来查找元素
2. bsearch中的base必须是升序排列的数组
3. 如果数组里有重复的答案,则bsearch会返回其中一个的地址 (具体返回哪一个不确定)
4. bsearch有五个自变量,第一个是要找的东西,剩下的跟qsort一模一样
5. bsearch如果没找到所求则回传NULL ,否则回传该元素被找到的地址(void *)

qsort()和bsearch()的用法

使用qsort()排序 并 用 bsearch()搜索是一个比较常用的组合,使用方便快捷。
比如:对一个长为1000的数组进行排序时,int a[1000]; 那么base应为a,num应为 1000,width应为 sizeof(int),comp函数随自己的命名。

  1. qsort(a,1000,sizeof(int ),comp);
  2. //其中comp函数应写为:
  3. int comp(const void *a,const void *b)
  4. {
  5. return *(int *)a-*(int *)b;
  6. }

对一个二维数组的进行排序:

int a[1000][2]; 其中按照a[i][0]的大小进行一个整体的排序,其中a[i][1]必须和a[i][0]一起移动交换。

  1. qsort(a,1000,sizeof(int)*2,comp);
  2.  
  3. int comp(const void *a,const void *b)
  4. {
  5. return ((int *)a)[0]-((int *)b)[0];
  6. }

对字符串进行一个排序:

  1. char a[1000][20];
  2.  
  3. qsort(a,1000,sizeof(char)*20,comp);
  4.  
  5. int comp(const void *a,const void *b
  6. {
  7. return strcmp((char *)a,(char *)b);
  8. }

对一个结构体进行排序:

  1. typedef struct str
  2. {
  3. char str1[11];
  4. char str2[11];
  5. }str,*stri;
  6. str strin[100001]={0};
  7.  
  8. int compare(const void *a,const void *b)
  9. {
  10. return strcmp( ((str*)a)->str2 , ((str*)b)->str2 );
  11. }
  12.  
  13. qsort(strin,total,sizeof(str),compare);

而关于bsearch() ,他和qsort的用法基本一样,只是他的返回值是一个指向找到的单位元素的一个指针,另外他多了一个参数,是一个指向查找元素的一个指针。
比如:从上面例子中的结构体数组中查找一个字符串:

  1. str *locate;
  2. char buffer[30]="abc";
  3. locate=(str*)bsearch(buffer,strin,total,sizeof(str),com);
  4. int com(const void *a,const void *b)
  5. {
  6. return strcmp( (char*)a, ((str*)b)->str2 );
  7. }

您还可能感兴趣的内容

日志信息 »

该日志于2009-12-27 14:07由 admin 发表在C/C++分类下, 你可以发表评论。除了可以将这个日志以保留源地址及作者的情况下引用到你的网站或博客,还可以通过RSS 2.0订阅这个日志的所有评论。

没有评论

发表评论 »

返回顶部