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

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

}

    原文作者:查找算法
    原文地址: https://blog.csdn.net/weixin_40389330/article/details/80938455
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞