写在前面
阅览者,你好!我是计算机科学与技术专业的一名大三在读学生,希望通过写博客的方式来督促自己学习。如果您发现本篇博客中的问题,您可以在评论区反馈给我。
二分查找
二分查找的简单概念
二分查找又称为折半查找,是一种高效的查找方法。
二分查找的前提是 被搜索的数组必须是一个有序的数组。这一点非常重要,在实际中,二分查找通常伴随着快速排序算法的使用。
二分查找的基本思路
先来看下面这个例子,这是使用二分查找在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;
}
}
结束语
在我看来,学习算法更多的是学习算法的思想。
在设计程序的时候,我们更应该注重程序的稳定性。在稳定性可以保障的前提下,提高运算速度岂不是一件更加好的事情。