算法学习系列一:二分查找

写在前面

阅览者,你好!我是计算机科学与技术专业的一名大三在读学生,希望通过写博客的方式来督促自己学习。如果您发现本篇博客中的问题,您可以在评论区反馈给我。

二分查找

二分查找的简单概念

二分查找又称为折半查找,是一种高效的查找方法。

二分查找的前提是 被搜索的数组必须是一个有序的数组。这一点非常重要,在实际中,二分查找通常伴随着快速排序算法的使用。 

二分查找的基本思路  

先来看下面这个例子,这是使用二分查找在arr数组中查找202的过程。如果想更快一点,您也可以直接通过查看代码来理解二分查找的思路。

 

在二分查找中,我们只用关心四点:mid、初始值、比较和移动、什么时候跳出循环。

mid:

mid永远等于(low+high)/2。

初始值:

low的初始值为数组第一个数的下标值,high的初始值为数组最后一个数的下标值。

比较和移动:

此处的比较指的是数值中下标为mid的值和想要查找的目标值target的比较。假定数组名为arr。

若arr[mid]==target,说明找到了target值。

若arr[mid]<target,说明target在[mid+1,high]中,移动low,即让low=mid+1。

若arr[mid]>target,说明target在[low,mid-1]中,移动high,即让high=mid-1。

什么时候跳出循环:

当arr[mid]==target时,说明找到了target,可以跳出循环。

当low>high时,说明没有找到target值,跳出循环。

二分查找的核心代码

//arr是一个升序数组,target是需要查找的关键字,arrSize为数组长度。
//这个代码可以很方便的判断target是否在arr中。
//若f==1,则说明target在arr中;若f==0,则说明不在。
low=0,high=arrSize-1;
f=0;
while(low<=high){
    mid=(low+high)/2;
    if(arr[mid]==target){
        f=1;
        break;
    }
    else if(arr[mid]<target) low=mid+1;
    else if(arr[mid]>target) high=mid-1;
}
//当数组中有多个target值时,该代码找到的是下标值最大的target。
//若ans==-1,说明没有找到target值。
low=0,high=arrSize-1;
ans=-1;
while(low<=high){
    mid=(low+high)/2;
    if(arr[mid]<=target){
        low=mid+1;
        ans=mid;
    }
    else if(arr[mid]>target) high=mid-1;
}
    
//当数组中有多个target值时,给数组找到的是下标值最小的target。
//如果ans==-1,那么说明没有找到target值。
low=0,high=arrSize-1;
ans=-1;
while(low<=high){
    mid=(low+high)/2;
    if(arr[mid]<target) low=mid+1;
    else if(arr[mid]>=target){
        high=mid-1;
        ans=mid;
    }
}

结束语

在我看来,学习算法更多的是学习算法的思想。

在设计程序的时候,我们更应该注重程序的稳定性。在稳定性可以保障的前提下,提高运算速度岂不是一件更加好的事情。 

 

  

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值