变体一:查找第一个值等于给定值的元素
有序数据集合中存在重复的数据,我们希望找到第一个值等于给定值的数据。比如下面这样一个有序数组,其中,有四个元素的值都等于 8,是重复的数据。我们希望查找第一个等于 8 的数据。
#include<iostream>
using namespace std;
int main() {
int arr[] = { 1,2,3,4,5,6,7,8,8,8,8,9,10,13,15,17,19 };
int num = sizeof(arr) / sizeof(arr[0]);
int target = 8;
int low = 0;
int high = num - 1;
int mid;
while (low <= high)
{
mid= (low + high) / 2;
if (arr[mid] == target)break;
else if (arr[mid] > target)
high = mid - 1;
else
low = mid + 1;
}
while (arr[mid] ==target)
mid--;
mid = mid + 1;
cout << "Exist!We have arr[" << mid << "]" << "=" << target << endl;
if(arr[mid]!=target)
cout << "NULL! " << target << " doesn't exist in the array!\n";
return 0;
}
变体二:查找最后一个值等于给定值的元素
#include<iostream>
using namespace std;
int main() {
int arr[] = { 1,2,3,4,5,6,7,8,8,8,8,9,10,13,15,17,19 };
int num = sizeof(arr) / sizeof(arr[0]);
int target = 8;
int low = 0;
int high = num - 1;
int mid;
while (low <= high)
{
mid= (low + high) / 2;
if (arr[mid] == target)break;
else if (arr[mid] > target)
high = mid - 1;
else
low = mid + 1;
}
while (arr[mid] ==target)
mid++;
mid = mid - 1;
cout << "Exist!We have arr[" << mid << "]" << "=" << target << endl;
if(arr[mid]!=target)
cout << "NULL! " << target << " doesn't exist in the array!\n";
return 0;
}
变体三:查找第一个大于等于给定值的元素
在有序数组中,查找第一个大于等于给定值的元素。比如,下面数组中存储的这样一个序列,如果查找第一个大于等于 11 的元素,那就是 13。
#include<iostream>
using namespace std;
int main() {
int arr[] = { 1,2,3,4,5,6,7,8,8,8,8,9,10,13,15,17,19 };
int num = sizeof(arr) / sizeof(arr[0]);
int target = 11;
int low = 0;
int high = num - 1;
int mid;
while (low <= high)
{
mid= (low + high) / 2;
if (arr[mid] >= target)break;
else low = mid + 1;
}
while (arr[mid] >=target)
mid--;
mid = mid + 1;
cout << "Exist!We have arr[" << mid << "]" << "=" << target << endl;
if(arr[mid]!=target)
cout << "NULL! " << target << " doesn't exist in the array!\n";
return 0;
}
变体四:查找最后一个小于等于给定值的元素
查找最后一个小于等于给定值的元素。比如,数组中存储了这样一组数据,最后一个小于等于 7的元素就是 7。
#include<iostream>
using namespace std;
int main() {
int arr[] = { 1,2,3,4,5,6,7,8,8,8,8,9,10,13,15,17,19 };
int num = sizeof(arr) / sizeof(arr[0]);
int target = 7;
int low = 0;
int high = num - 1;
int mid;
while (low <= high)
{
mid= (low + high) / 2;
if (arr[mid] <= target)break;
else high = mid - 1;
}
while (arr[mid] <=target)
mid++;
mid = mid - 1;
cout << "Exist!We have arr[" << mid << "]" << "=" << target << endl;
if(arr[mid]!=target)
cout << "NULL! " << target << " doesn't exist in the array!\n";
return 0;
}