二分查找相信大家都十分清楚,其应用前提是在已有序的数组中查找 ,目的是提高查找效率由O(N)到O(logN)
//基础版本
int binarySearch(const vector<int> data, int num)
{
int begin = 0;
int end = sizeof(data) / sizeof(int) - 1;
while(begin <= end){
int mid = (end - begin)/2 + begin;
if(num == data[mid]) return mid;
else if(num > data[mid]) begin = mid +1;
else end = mid - 1;
}
return -1;
}
这里主要介绍一种加强版二分查找,要求是在有重复子序列中找到最先出现的某数
技巧点在于在当中间值和比较的数值相等的时候,以中间值作为end
//加强版(有序序列中最先出现的num)//有重复数
int binarySearch(const vector<int> data, int num)
{
int begin = 0;
int end = sizeof(data) / sizeof(int) - 1;
while(begin < end){
int mid = (end - begin)/2 + begin;
//技巧点
if(data[mid] == num)
end = mid;
else if(data[mid] < num)
begin = mid + 1;
else
end = mid -1;
}
if(data[begin] == num)
return begin;
else return -1;
}