本文的嘗試還是源於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;
}
}