二分查找(Binary_search)

本文深入讲解了二分查找算法的基本原理,包括折半思想、边界更新策略及代码实现。通过具体的示例代码,展示了如何在有序数组中高效查找目标元素,并分析了二分查找的时间复杂度。

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

二分查找的对象必须是有序的数组,因此在进行查找之前必须对数组进行排序;二分查找的思想是就是折半思想,给定待查找的元素,左边界下标left,右边界下标right,以及中间下边mididx;对于一组升序 的数组进行查找时,left<=right ,这时比较中见下标元素值和待查找元素下标值,如果待查找值比中间下标值大,则更新leftleft =mididx +1;比中间下标元素值小则更新rightright = mididx -1; 需要注意两种情况:

(1) 当到查找的值 比该数组元素 都小,最后left = right(left + right)/2 =mididx= 0 ,因此此时输出mididx始终为0;

(2) 当到查找的值 比该数组元素 都大,最后left = right(left + right)/2 =mididx= N-1 ,因此此时输出mididx始终为N-1

二分查找具体代码如下:

#include <stdio.h>
#define N 10
int main()
{
    int arr[N] = {1,2,3,4,5,6,7,8,9,10};
    int left = 0;          //左边界
    int  right = N-1;      // 右边界
    int mididx;            // 折半下标
    int idx = -1;          // 输出下标
    int findData = 10;     // 待查找元素

    while(left <= right)
    {
        mididx = (left + right)/2; 
        if(findData == arr[mididx])
        {
            idx = mididx;  //找到对应的元素 记录下标
            break;
        }
        else if (findData > arr[mididx])
            left = mididx + 1;     //更新左边界
        else
            right = mididx -1;     //更新右边界
    }
    if (idx==-1)
    {
         printf("none !\n");        // 没有查找到
    }
    else
        printf("indec=%d\n",idx);   // 查找成功

    return 0;
}

冲时间复杂度上看,二分查找的时间复杂度为:O^{_{(n)}}

模板函数写法

函数模版: 

template<typename T>
int  binary_search (T arr[],  int size,  T target) ;

参数说明:
T: 模版参数
arr :  数组首地址, 
size: 数组元素个数, 
T target : 需要查找的值
返回值: 如果数组中找到target, 返回其下标;否则返回 -1;要求数组元素顺序非递减

template<typename T>                                //   T: 模版参数
int  binary_search (T arr[], int size,  T target)   //size:数组元素个数,T target:需要查找的值  
{                                                   //    arr:数组首地址, 
   int position;                 //返回查找元素的下标
   T  data;                      // 待查找的元素的对象
   int bottom = 0;               // 左边界
   int top = size - 1;           //右边界
   while (bottom < top) {
      int mid = (bottom + top) / 2;   // 折半
      data = arr[mid];
      if (data < target)
         bottom = mid + 1;
      else
         top = mid;
   }
   if (top < bottom) 
        return -1;
   else {
      position = bottom;
      data = arr[bottom];

      if (data == target)  
          return position;
      else 
          return -1;
   }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值