对于编程人员来说,查找算法是非常常用的一种算法,在我们初学c语言时,我们曾经对数组进项遍历,最简单的是线性查找,但是这仅仅局限于int类型的数组,而非通用。如果能够针对任意类型使用查找算法,那么就会实现该算法的通用型,更能够体现它的范式。
1、二分查找的关键:二分查找的基本思想是通过不断缩小查找的范围,每次将数据与数组中间的数据进行比较,从而一步一步进行比较并且缩小范围,进而找到目标数。
2、通用查找算法思想:对于每种的数据类型,其数据的比较方式会有所不同,比如,两个整数的比较,只要把两个整数相减,看结果是0还是正负数就可以比较出大小。但是对于通用来说,并不意味着只是整数进行比较,对于两个字符串的比较可以就要用strcmp进行比较,利用的函数原型是void* bsearch ( void* key, void* base, int num, int size, int (*compar)(const void*,const void*)) 第五个参数是一个指针类型的函数,它所指向的函数时一个比较函数。带两个void*参数,返回比较过后的结果。
3、通用二分查找源码(c):
#include <stdio.h>
void* bsearch ( void* key, void* base, int num, int size, int (*compar)(const void*,const void*))
{
int low = 0;
int high = num-1;
int mid;
while (low <= high)
{
mid = (low + high) >> 1;
if (compar(key, (char *)base + mid * size) == 0) {
break;
}
else if (compar(key, (char *)base + mid * size) < 0) {
high = mid-1;
}
else {
low = mid+1;
}
}
if (low <= high)
{
return (char *)base + mid * size;
}
return NULL;
}
int compare_int( void *elem1, void *elem2)
{
return *(int *)elem1 - *(int *)elem2;
}
int main()
{
int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};int key = 88;
int *p = (int *)bsearch(&key, a, 10, sizeof(int), compare_int);
if (p != NULL)
{
printf("find key in a: %d\n", *p);
}
else {
printf("Not Find!");
}
return 0;
}