二分查找你针对有序序列而言的一种查找算法,关于二分查找有一下的几类问题:
1. 给定一个有序(不降序)数组arr,求任意一个i使得arr[i]等于v,不存在则返回-1
#include <iostream>
using namespace std;
int binarySearch(int A[], int left, int right, int t)
{
int m;
while(left <= right){
m = left + (right - left) / 2;
if(A[m] < t)
left = m + 1;
else if(A[m] > t)
right = m - 1;
else
return m;
}
return -1;
}
int main()
{
int A[] = {1,2,2,2,3,4,5,6,7};
cout << binarySearch(A, 0, 8, 2);
return 0;
}
2.给定一个有序(不降序)数组arr,求最小的i使得arr[i]等于v,不存在则返回-1
#include <iostream>
using namespace std;
int binarySearch(int A[], int left, int right, int t)
{
int m;
while(left < right){
m = left + (right - left) / 2;
if(A[m] < t)
left = m + 1;
else if(A[m] > t)
right = m - 1;
else
right = m;
}
if(A[right] == t)
return right;
else if(A[left] == t)
return left;
else
return -1;
}
int main()
{
int A[] = {2,3};
cout << binarySearch(A, 0, sizeof(A) / sizeof(A[0]) - 1, 3);
return 0;
}
3.给定一个有序(不降序)数组arr,求最大的i使得arr[i]等于v,不存在则返回-1
#include <iostream>
using namespace std;
int binarySearch(int A[], int left, int right, int t)
{
int m;
while(left < right - 1){
m = left + (right - left) / 2;
if(A[m] < t)
left = m + 1;
else if(A[m] > t)
right = m - 1;
else
left = m;
}
if(A[right] == t)
return right;
else if(A[left] == t)
return left;
else
return -1;
}
int main()
{
int A[] = {2,3};
cout << binarySearch(A, 0, sizeof(A) / sizeof(A[0]) - 1, 3);
return 0;
}
4.给定一个有序(不降序)数组arr,求最大的i使得arr[i]小于v,不存在则返回-1
5.给定一个有序(不降序)数组arr,求最小的i使得arr[i]大于v,不存在则返回-1