通用的二分法查找算法理解

对于编程人员来说,查找算法是非常常用的一种算法,在我们初学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
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;
}

你可能感兴趣的:(通用的二分法查找算法理解)