二分查找

二分查找思想:二分查找可以解决预排序数组的查找问题。只要数组中包含T(即要查找的值),那么通过不断的缩小包含T的范围,最终就可以找到它。一开始,范围覆盖整个数组,将数组的中间项与T进行比较,可以排除一般的元素,范围缩小一半。就这样反复比较反复缩小范围,最终就会在数组中找到T,或者确定原以为T所在的范围实际为空。对于包含N个元素的表,整个查找过程大约要经过Log(2)N次比较。
       注意:二分查找是针对有序的数组而言的。
#include<iostream>
using namespace std;
int binary_search(int arr[], int n, int key)
{
    int left = 0;   //数组的首位置,即arr[0]处
    int right = n - 1;//数组的最后一个位置,即arr[n-1],数组大小为n
    //循环条件一定要注意
    while (left <= right)
    {
        int mid =(left+right)/2; //放在while循环内部,否则mid无法正确更新;如果此处用移位代替除以2可以提高效率,而且可以防止溢出(int mid =left + ((right - left) >> 1);)。
        if (arr[mid] > key)//数组中间的位置得数大于要查找的数,那么我们就在中间数的左区间找
        {
            right = mid - 1;
        }
        else if (arr[mid] < key)//数组中间的位置得数小于要查找的数,那么我们就在中间数的右区间找
        {
            left = mid + 1;
        }
        else
        {
            return mid;//中间数刚好是要查找的数字。
        }
    }
    //执行流如果走到此处说明没有找到要查找的数字。
    return -1;
}
int main()
{
    int arr[5] = { 1, 3, 5, 9, 10 };
    int ret1 = 0,ret2 = 0,ret3 = 0;
    ret1 = binary_search(arr, 5, 9);
    cout << ret1 << endl;
    ret2 = binary_search(arr, 5, 5);
    cout << ret2 << endl;
    ret3 = binary_search(arr, 5, 2);
    cout << ret3 << endl;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值