二分查找(完善)

    最近在准备找实习,参加阿里的校招笔试时遇到了二分法的改错题,以前总是死记硬背,现在,呵呵,还是理解了比较好。


int B_SearchEqual(int* A, int n, int _value)
{
	int low = 0;
	int high = n - 1;
	while(low <= high)
	{
		int mid = low + ((high - low)>>1);
		if(A[mid] > _value)
			high = mid - 1;
		else if(A[mid] < _value)
			low = mid + 1;
                else
                        return mid;
	}
	return -1;
}

    

    同学在看STL源码剖析时遇到二分法的一些变形:大于_value 的第一个数字的位置,没有则返回-1;小于_value的最后一个数字的位置,没有则返回-1;

                                                                                              第一个_value的位置;   最后一个_value的位置;

1、首先,大于_value 的第一个数字的位置,没有则返回-1:

int B_SearchFirstGreater(int* A, int n, int _value)
{
	int low = 0;
	int high = n - 1;
	while(low <= high)
	{
		int mid = low + ((high - low)>>1);
		if(A[mid] > value)
			high = mid - 1;
		else
			low = mid + 1;
	}

	if(A[low] > ta)
		return low;
	else
		return -1;
}
2、小于_value的最后一个数字的位置,没有则返回-1

int B_SearchLastSmaller(int* A, int n, int _value)
{
	int low = 0;
	int high = n - 1;
	while(low <= high)
	{
		int mid = low + ((high - low)>>1);
		if(A[mid] >= _value)
			high = mid - 1;
		else
			low = mid + 1;
	}

	if(A[high] > ta)
		return high;
	else
		return -1;
}


3、第一个_value的位置

int B_SearchFirstEqual(int* A, int n, int _value)
{
	int low = 0;
	int high = n - 1;
	while(low <= high)
	{
		int mid = low + ((high - low)>>1);
		if(A[mid] >= _value)
			high = mid - 1;
		else
			low = mid + 1;
	}

	if(A[low] == _value)
		return low;
	else
		return -1;
}

4、最后一个_value的位置

int B_SearchLastEqual(int* A, int n, int _value)
{
	int low = 0;
	int high = n - 1;
	while(low <= high)
	{
		int mid = low + ((high - low)>>1);
		if(A[mid] > _value)
			high = mid - 1;
		else
			low = mid + 1;
	}

	if(A[high] == _value)
		return high;
	else
		return -1;
}


    在网上搜了一些有用的资料,发现一个很好的博客: http://blog.csdn.net/luckyxiaoqiang/article/details/8937978

    虽然实现方法不同,但是原理是一样的,so在此补充一些延伸的题目:

5、_value在有序表中出现的个数

int CalEqualCounts(int* A, int n, int _value)
{
	int first_index = B_SearchLastSmaller(A, n, _value) + 1;
	if(first_index == -1)
		return 0;
	int last_index = B_SearchFirstGreater(A, n, _value) - 1;
	return last_index - first_index + 1;
}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值