折半查找,喔~折半查找

本文的尝试还是源于July大神的一片文章:见此:http://blog.csdn.net/v_july_v/article/details/7093204

文中提到, Jon Bentley说90%以上的程序员无法正确无误的写出二分查找代码。

不觉深以为然~~~

因为本科找工作时,面过一家公司,面官让写出折半查找的C++实现。

算法很简单,过程很清晰,不禁暗喜,这题so easy啊。。

但是写着写着才发现,虽然算法过程在脑子里异常清晰,但是落到代码上却是漏洞百出,逻辑混乱。。。

归根到底还是编码练的太少。。

由此发现,很多算法只有感性的认识是完全不够的,因为实现过程中有很多细节是容易忽略或弄混的。

算法要自己亲手实现一下,并把实现过程中自己碰到的错误、疑问记录下来分析,才能对算法有更深刻的认识。。

以下是我的两个实现,一个用循环,一个用递归。递归实现很不规范。

很可能有错误,大家谨慎参考,欢迎批评指正~~~~

int search_loop(int *data,int count,int value)
{
	int middle,low=0,high=count;
	while(low<=high)
	{
		middle=(high+low)/2;
		//middle=low+(hight-low)/2
		if(data[middle]==value)
		{
			return middle;
		}else
		{
			if(value>data[middle])
			{
				low=middle+1;
			}else
			{
				high=middle-1;
			}
		}
	}
	return -1;
}


void search_recursion(int *data,int count,int value)
{
	int middle=count/2;
	if(value==(data[middle]))
	{
		printf("success\n");
		return;
	}
	if(middle==0)
	{
		printf("failure\n");
		return;
	}
	if(value<(data[middle]))
	{
		search_recursion(data,middle-1,value);
		return;
	}
	if(value>(data[middle]))
	{
		search_recursion(data+middle+1,count-middle-1,value);
		return;
	}
}



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值