//二分查找 ------ 有序数组 ------ 递归+非递归
//非递归
int BinarySearch_1(vector<int>arr,int val)
{
int left = 0;
int right = arr.size() - 1;
while (left < right)
{
int mid = (left + right) / 2;
if (arr[mid] > val)
{
right = mid - 1;
}
else if (arr[mid] < val)
{
left = mid + 1;
}
else
{
return mid;
}
}
return -1;
}
//递归
int BinarySearch(vector<int>arr, int left,int right,int val)
{
if (left > right)
{
return -1;
}
int mid = (left + right) / 2;
int midVal = arr[mid];
if (val > midVal)
{
return BinarySearch(arr, mid + 1, right, val);
}
else if (val < midVal)
{
return BinarySearch(arr, left, mid - 1, val);
}
else
{
return mid;
}
}
//递归+ 返回多个值
vector<int> BinarySearch_2(vector<int>arr, int left, int right, int val)
{
int mid = (left + right) / 2;
int midVal = arr[mid];
if (val > midVal)
{
return BinarySearch_2(arr, mid + 1, right, val);
}
else if (val < midVal)
{
return BinarySearch_2(arr, left, mid - 1, val);
}
else
{
vector<int>equalArr;
int temp = mid - 1;
while (true)
{
if (temp < 0 || arr[temp] != val)
{
break;
}
equalArr.push_back(temp);
temp -= 1;
}
equalArr.push_back(mid);
temp = mid + 1;
while (true)
{
if (temp > (arr.size()-1) || arr[temp] != val)
{
break;
}
equalArr.push_back(temp);
temp += 1;
}
return equalArr;
}
}