知识点-二分查找

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;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值