C语言实现的通用二分查找算法

本文作者受到Redis和SQLite源码中对内存操作的启发,描述了如何用C语言编写一个通用的二分查找函数,旨在提高代码复用性和减少调试时间。通过compare函数进行元素比较,实现在已排序结构中的查找功能。
摘要由CSDN通过智能技术生成

在读了redis和sqlite的源码之后,不知不觉就被其中任意操作某个字节的思想感染了,同时为了效率,平时写的代码也喜欢用C语言,C语言经常重复的写二分查找,对于不同的元素得重复的写,于是打算像C++ STL那样写一个泛型的二分查找,以后再需要二分查找的时候就不用重复实现,重复调试了,在此做记录
如果查找不存在将返回查找目标值应该插入的位置

//compare返回1取后半段,返回-1取前半段,返回0代表相等
int binarySearch(void *data, void *target, size_t offset, size_t size, int(*compare)(void *x, void *y)){
    int begin = 0, end = size - 1, mid = (begin + end) / 2;
    while(begin <= end){
        if(compare((char *)data + offset * mid, target) == 0)
            return mid;
        else if(compare((char *)data + offset * mid, target) < 0)
            end = mid - 1;
        else
            begin = mid + 1;
        mid = (begin + end) / 2;
        if(end < 0)
            return 0;
    }
    return begin;
}

int compare(void *x, void *y){
    if(*(int *)x == *(int *)y){
        return 0;
    }else if(*(int *)x > *(int *)y){
        return -1;
    }else{
        return 1;
    }
}

struct dataGroup{
    int a;
    int b;
};

int main(){
    dataGroup data[] = {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {5, 5}, {6, 6}};
    int target = 10;
    printf("%d\n", binarySearch(data, &target, sizeof(dataGroup), sizeof(data) / sizeof(dataGroup), compare));
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值