知识点-二分查找

int my_binary_serach(int * a, int len, int target) 
1 中位数有两个
  上位中位数:median=len/2
  下位中位数:median=len/2 - 1
  常用下位中位数,写法如下:median=(len-1) /2
2 计算median要防止溢出
  median = low + (high - low) >> 1;
    当low +1 == high的时候,下一个会比较a[low]
3 循环终止的条件是low > high
  low与high中间的数据是目标区间,当目标区间缩小为0的时候,就终止
    a[mid]<target, low = mid + 1
    a[mid]>target, high = mid - 1
    a[mid] == target, return mid;
  如果数组中没有重复数字:
  只有在a[mid]<target的时候,low才会移动到mid+1的位置,所以low保存的是a数组中第一个大于等于target元素的位置
  只有在a[mid]>target的时候,high才会移动到mid-1的位置,所以high保存的是a数组中第一个小于target元素的位置

4 当数组中有重复数据的时候,想要输出第一个大于等于target元素的位置
a[mid]<target, low = mid + 1
    a[mid]>=target, high = mid - 1
low保存的还是第一个大于等于target的元素的位置
high保存的是第一个小于target元素的位置
如果修改a[mid]<=target,low = mid+1,那么low中存储的就是第一个大于target的元素的位置

代码如下:
int my_binary_serach(int * a, int len, int target)
{

	int low=0, high=0;
	high = len - 1;
	int mid;
	while (low <= high)
	{
		
		mid = low + ( (high - low) >> 1 );
		if (a[mid] < target)
		{
			low = mid + 1;
		}
		else if (a[mid] >= target)
		{
			high = mid - 1;
		}
	}
	if (a[low] != target)
	{
		cout << "没有找到"<<low << endl;
	}
	else
	{
		cout << "找到了:"<<low << endl;
	}
	return low;
}




阅读更多
个人分类: 学习日记
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭