本文的尝试还是源于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;
}
}