非递归和递归实现简单二分查找
学习记录+1
#include<iostream>
#include<string>
using namespace std;
int recursive(int a[], int left, int right, int val);
int besearch_while(int a[], int len, int val)
{
int left = 0;
int right = len - 1;
while (left<=right)
{
int mid = left + (right - left) / 2;//相比较(right+left)/2,这种方法可以有效避免int溢出
//int mid = (right + left) / 2;
if (a[mid]==val)
{
return mid;
}
else if (a[mid]>val)
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
return -1;
}
int besearch_recursive(int a[], int len, int val)
{
int left = 0;
int right = len - 1;
int res = recursive(a, left, right, val);
return res;
}
int recursive(int a[], int left, int right, int val)
{
if (left>right)
{
return -1;
}
int mid = left + (right - left) / 2;
if (a[mid]==val)
{
return mid;
}
else if (a[mid]<val)
{
return recursive(a, mid + 1, right, val);
}
else
{
return recursive(a, left, mid - 1, val);
}
}
int main()
{
int a[8] = { 1,2,3,4,5,6,7,8};
//int res = besearch_while(a, 8, 5);
int res = besearch_recursive(a, 8, 5);
cout << res;
system("pause");
return 0;
}
ps:就很突然想记录自己的学习路程,前面的以后也传上来吧!加油
4.29更新
二分查找还有一些变式问题,直接贴上笔记
变体三和变体四思路上和前两和没什么区别
int bsearch1(int a[], int len, int val)//查找第一个值等于给定值的元素
{
int left = 0, right = len - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (a[mid] == val)
{
//变体一
if (mid == 0 || a[mid - 1] != val)
{
return mid;
}
else
{
right = mid - 1;
}
变体二
// if (mid == right || a[mid + 1] != val)
// {
// return mid;
// }
// else
// {
// left = mid+1;
// }
}
else if (a[mid] > val)
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
return -1;
}
三四就不写了哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈