二分查找
一.基本思路:对于一个有序的数组或者顺序表,要查找某个元素是否在其中,取中间元素作为比较对象,若给定的值与中间元素相等,则查找成功;若给定的值比中间元素小,则在中间元素的左侧区域继续查找,反之就在右侧区域查找。不断重复上述过程,直到查找成功或者查找失败。
二.实现过程:
1.设置查找范围:
#include<iostream>
using namespace std;
int low=0,high=n-1,mid;
2.查找部分:
while(low<=high)
{
int mid=(low+high)/2;
if(a[mid]==x)
{
cout<<mid;
break;
}
else if(a[mid]<x)low=mid+1;
else high=mid-1;
}
if(low>high)cout<<-1;
如果存在就输出下标,不存在就输出-1;
例:
三.如果要查找的值存在不止一个,此时要求输出第一次出现这个值的坐标(即最小的坐标),代码可做如下改动。
#include<iostream>
using namespace std;
int low=1,hogh=n,mid;
while(low<high)
{
int mid=(low+high-1)/2;
if(a[low]==x)//x是要查找的值
{
cout<<low;
break;
}
else if(a[mid]>=x)high=mid;
else low=mid+1;
}
if(low>high)cout<<-1;
四。如果要输出查找的值出现最后一个的下标可做如下改动:
int low=0,high=n;
while(low<high)
{
int mid=(low+high-1)/2;
if(a[high]==x)
{
cout<<high;
break;
}
else if(a[mid]>=x)high=mid;
else low=mid+1;
}
if(low>high)cout<<-1;