二分查找
概述:二分查找是对有序数列,每次都将数据范围减小一般的查找。
时间复杂度:log(n)
#include "iostream"
using namespace std;
//注意:输入的数组必须是有序的。升序
int BinarySearch(int a[],int size,int p)
{
int start = 0;
int mid;
int end = size - 1;
while (end >= start) //注意大于等于
{
mid = start+(end- start) / 2; //注意start需要加上
if (a[mid] == p)
{
return mid;
}
if (a[mid] > p)
{
end = mid - 1;
}
else
{
start = mid + 1;
}
}
return -1;
}
/*
例题:
写一个函数LowerBound,在包含size个元素的,从小到大排序的int数组a里查找比给定整数p小的,下标最大的元素。找到则返回下标,找不到则返回-1.
*/
int LowerBound(int a[],int size,int p)
{
int start = 0;
int end=size-1;
int mid;
int destiny_pos = -1;
while (end >= start) //注意大于等于
{
int mid = start + (end - start) / 2;
if (a[mid] < p)
{
destiny_pos = mid;
start = mid + 1;
}
else
{
end = mid - 1;
}
}
return destiny_pos;
}