二分查找时在给定已按升序排好序的n个元素a[0:n-1], 用折半查找法在从这n个元素中找出一特定元素x,时间复杂性为O(logn)。
具体实现如下:
//二分查找 static int binarySearch(int []a, int x, int n) { int left = 0,right = n-1; int middle; while (left <= right) { middle = (left+right)/2; if (x == a[middle]) return middle; if (x > a[middle]) left = middle + 1; else right = middle - 1; } return -1; }
二分查找函数:
void *bsearch(const void *key, const void *base, size_t nmem, size_t size, int (*comp)(cosnt void *, const void *))
key指向所要查找的元素,base指向进行查找的数组,nmem为查找长度,一般为数组长度,size为每个元素所占的字节数,一般用sizeof(...)表示,comp指向比较子函数,它定义比较的规则。
在用bsearch函数之前,必须对数组进行排序。那么用qsort比较方便。
void qsort(void *base, int nelem, int width,int (*comp)(const void*, const void *))
具体实现如下:
//void *bsearch(const void *key, const void *base, size_t nmem, size_t size, int (*comp)(cosnt void *, const void *)) //void qsort(void *base, int nelem, int width,int (*comp)(const void*, const void *)) #include <stdio.h> #include <stdlib.h> int cmp(const void *a, const void *b); int main() { int values[]= {12,6,89,10,23}; int key = 10; int i, *p; qsort(values,5,sizeof(int),cmp); for (i = 0; i < 5; i++) { printf("%d ",values[i]); } printf("\n"); p = bsearch(&key,values,5,sizeof(int),cmp); if(p == NULL) printf("NULL\n"); else printf("FOUND! %d\n",*p); return 0; } int cmp(const void *a, const void *b) { return *(int *)a - *(int *)b; }
2013/6/1 22:06