二分查找
虽然二分查找我已经写过很多遍了但是每次重新写的时候总是不那么顺畅,一些小错误不断出现,因此想写几个模板……..
在不降序列中查找第一个大于goal的元素位置,若没有比goal大的返回最后一个,若都比goal大返回第一个:
int find(int * res,int left,int right,int goal)
{
int mid;
while(left < right)
{
mid = (left + right) >> 1;
if(res[mid] > goal)
right = mid;
else
left = mid+1;
}
return left;
}
若查找的是第一个大于等于goal的元素的位置
int find(int * res,int left,int right,int goal)
{
int mid;
while(left < right)
{
mid = (left + right) >> 1;
if(res[mid] >= goal)
right = mid;
else
left = mid+1;
}
return left;
}
在一个不增序列中查找第一个小于等于goal的元素位置,若都比goal大的返回最后一个,若都比goal小返回第一个:
int find(int * res,int left,int right,int goal)
{
int mid;
while(left < right)
{
mid = (left + right) >> 1;
if(res[mid] > goal)
left = mid+1;
else
right = mid;
}
return left;
}
若是查找第一个小于goal的元素的位置:
int find(int * res,int left,int right,int goal)
{
int mid;
while(left < right)
{
mid = (left + right) >> 1;
if(res[mid] >=goal)
left = mid+1;
else
right = mid;
}
return left;
}