用C++写了两个二分搜索的函数,两种方法略有不同,第一种用的递归,第二种用的迭代,而且第二种是找重复的目标中的最先出现的一个。如下:
#include<iostream>
#include<vector>
using namespace std;
int binary_search(int arr[], int key, int imin, int imax);
int getPos(vector<int> A, int n, int val);
int main()
{
int a[6] = {4,4,10,21};
int out = binary_search(a, 1, 0, 5);
vector<int> arr(a,a+6);
int out2=getPos(arr, 4, 4);
std::cout << out2<<std::endl;
system("pause");
}
int binary_search(int arr[], int key, int imin, int imax)
{
if (imin > imax)
{
return -1;
}
else
{
int imid = imin + ((imax - imin) >>1);//用右移1代替除以2,同时这句防止溢出。
if (arr[imid] > key) binary_search(arr, key, imin, imid - 1);
else if (arr[imid] < key) binary_search(arr, key, imid + 1, imax);
else return imid;
}
}
int getPos(vector<int> arr,int n, int val) {
// write code here
int left = 0;
int right = n - 1;
while (left <= right)
{
int mid = left + ((right - left) / 2);
if (arr[mid]<val) left = mid + 1;
else if (arr[mid]>val) right = mid - 1;
else
{
while (true)
{
if (mid != 0 && arr[mid - 1] == arr[mid]) mid = mid - 1;
else return mid;
}
}
}
}