二分查找時在給定已按升序排好序的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