【数据结构与算法】二分查找法(C++、Python)

原理:

查找过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果待查找元素大于中间元素,则在数组中大于中间元素的那一半中查找(注意此时最小的索引和中间值的索引的关系);如果待查找元素小于中间元素,则在数组中小于中间元素的那一半中查找(注意此时最大的索引和中间值的索引的关系)。而且与开始时一样,从中间元素开始比较,如果在某一步骤数组为空,则代表找不到。这种查找算法每一次比较都使得搜索范围缩小一半!

在这里插入图片描述

程序实现(C++):

//假设待查找的数组已经排好序,且从大到小排序!
void binary_search(int *p)               //把数组名当做参数传递进来!
{
    int x, n, low, high, flag, mid;
    cout << "输入要查找的元素:";
    cin >> x;
    low = 0; high = n - 1;
    flag = 0;                           //用标志位来判断找到与否! 
    while (low <= high && !flag)
    {
        mid = (low + high) / 2;
        if (x < p[mid])
            high = mid - 1;
        else if (x == p[mid])
            flag = 1;
        else
            low = mid + 1;
    }
    if (flag)                            //如果找到!
        cout << x << "是数组中第" << mid + 1 << "个元素。" << endl;
    else
        cout << "数组中没有这个元素!" << endl;
}

程序实现(Python):

# 用递归的方法实现二分查找!!!如果找到,则返回待查找元素在数组中的索引,否则返回 -1
def binary_search(arr, m, n, x):
   mid = int(m + (n - m) / 2)                # 元素的中间位置
   
   if arr[mid] == x:
      return mid
   # 要查找的元素小于中间位置元素的值,则只需要再比较左半边的元素
   elif arr[mid] > x:
      return binary_search(arr, m, mid - 1, x)
   # 要查找的元素大于中间位置元素的值,则只需要再比较右半边的元素
   elif arr[mid] < x:
      return binary_search(arr, mid + 1, n, x)
   else:
      return -1  # 不存在

if __name__ =='__main__':
   arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
   x = eval(input("输入待查找的元素的值:"))
   n = len(arr)
   low, high = 0, n - 1

   # 函数调用
   if len(arr) > 0:
      result = binary_search(arr, low, high, x)

   if result != -1:
      print("元素在数组中的索引为:{}".format(result))
   else:
      print("元素不在数组中")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值