数据结构算法-二分查找算法

本文详细介绍了二分查找算法的核心思路,包括在有序数组中的查找过程以及其实现方法,特别提到了在连续且具有快速索引的数据结构(如数组和二叉搜索树)中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

二分查找算法 我们应该也不陌生 就在分治法把他说得彻彻底底了 但分而治之算法思想 只是算法的部分 递归 和循环那个效率高呢 很明显循环 所以不必要多说 直接干

二分查找算法核心思路

二分查找算法是一种在有序数组中查找特定元素的搜索算法。
它的核心思路是每次查找都从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果目标元素大于或小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且同样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到目标元素。

记住只有顺序表和数组能用 当然二叉搜索树本来按照二分查找算法来的 这数据结构的规定 但算法只有连续并且有快速关键的索引 才是真正的快速 不是说链表不能实现 而是没有随机访问
可随机访问才有性价比

二分查找算法专区

// 函数定义:在给定的数组中查找特定的值  
int BinarySearch(void* arr, int size,int elementSize,  void *value ,int (*cmp)(void *,void*)) {  
  
    // 检查参数是否有效  
    if (!arr&&elementSize<=0 &&size>0 &&!value) {  
        // 如果数组为空、元素大小小于等于0、数组大小大于0且查找值为空,则返回-1  
        return -1;  
    }  
      
    // 初始化左边界和右边界  
    int left = 0;  
    int right = size - 1;  
      
    // 声明用于存储比较结果的变量  
    int ret;  
      
    // 当左边界小于等于右边界时,继续查找  
    while (left <= right) {  
          
        // 计算中间位置  
        int mid = left + (right - left) / 2;  
          
        // 使用cmp函数比较中间位置的值与查找值  
        ret = cmp((char*)arr + (mid * elementSize), value);  
          
        // 如果cmp返回0,说明找到了目标值,返回中间位置的索引  
        if (ret == 0) {  
            return mid;  
        } else if (ret > 0) {  
            // 如果cmp返回大于0,说明查找值大于中间位置的值,向左半部分继续查找  
            right = mid - 1;  
        } else {  
            // 否则,查找值小于中间位置的值,向右半部分继续查找  
            left = mid + 1;  
        }  
    }  
      
    // 如果循环结束仍未找到目标值,返回-1表示未找到  
    return -1;  
}


// 定义一个比较函数,名为int_comp,它接受两个void类型的指针作为参数  
int int_comp(void* val1, void* val2) {  
  
    // 将void类型的指针val1转换为int类型的指针Element1  
    int* Element1 = (int*)val1;  
  
    // 将void类型的指针val2转换为int类型的指针Element2  
    int* Element2 = (int*)val2;  
  
    // 返回两个指针所指向的整数的差值。这里使用了指针解引用(*)操作符来获取指针指向的值。  
    return (*Element1 - *Element2);  
}

// 定义一个比较函数,名为char_comp,它接受两个void类型的指针作为参数  
int char_comp(void* val1, void* val2) {  
  
    // 将void类型的指针val1转换为char类型的指针Element1  
    char* Element1 = (char*)val1;  
  
    // 将void类型的指针val2转换为char类型的指针Element2  
    char* Element2 = (char*)val2;  
  
    // 返回两个指针所指向的字符的ASCII码值的差值。这里使用了指针解引用(*)操作符来获取指针指向的字符,并通过ASCII码值的差值来表示字符的排序。  
    return (*Element1 - *Element2);  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小森程序员

若能帮助到你,小费自愿付费

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值