php實(shí)現(xiàn)二分法的查找其實(shí)很簡單,跟我一起來看看怎么實(shí)現(xiàn)吧。
二分法查找需要數(shù)組是一個遞增的數(shù)組。
想要寫出二分法查找的代碼,首先要懂得二分法實(shí)現(xiàn)查找的原理:
①要知道中間位置就需要知道起始位置和結(jié)束位置,然后取出中間位置的值來和我們的值做對比。
②如果中間值大于我們的給定值,說明我們的值在中間位置之前,此時需要再次二分,因?yàn)樵谥虚g之前,所以我們需要變的值是結(jié)束位置的值,此時結(jié)束位置的值應(yīng)該是我們此時的中間位置。
③反之,如果中間值小于我們給定的值,那么說明給定值在中間位置之后,此時需要再次將后一部分的值進(jìn)行二分,因?yàn)樵谥虚g值之后,所以我們需要改變的值是開始位置的值,此時開始位置的值應(yīng)該是我們此時的中間位置,直到我們找到指定值。
④或者中間值等于最初的起始位置,或結(jié)束位置(此時說明給定值未找到)。
下面就看看怎么實(shí)現(xiàn)二分法吧!??!
/*遞歸調(diào)用實(shí)現(xiàn)二分法查找//$search 函數(shù) $array為數(shù)組,$K為要找的值,$low為查找范圍的最小鍵值,$high為查找范圍的最大鍵值//intval返回整數(shù)值*/functionsearch($array,$k,$low=0,$high=0){//判斷數(shù)組元素的數(shù)量if(count($array)!=0and$high==0){//判斷是否為第一次調(diào)用//數(shù)組的元素個數(shù)$high=count($array);}if($low<=$high){//如果還存在剩余的數(shù)組元素$mid=intval(($low+$high)/2);//取$low 與$high的中間值//return $array[$mid];if($array[$mid] ==$k){return$mid;//如果找到則返回}elseif($k<$array[$mid]){//如果上面沒有找到,則繼續(xù)查找returnsearch($array,$k,$low,$mid-1);}else{returnsearch($array,$k,$mid+1,$high);}}return"沒有要查找的值";}$array=array(3,4,5,7,8,9,10);echosearch($array,4);
/*//while循環(huán)實(shí)現(xiàn)二分法查找*/$arr=array(2,4,5,6,7,8,9,10);$low=0;//要查找范圍的最小鍵值$search=6;//計(jì)算出數(shù)組的長度$high=count($arr)-1;while($low<=$high){//取得數(shù)組的中間鍵值$mid=intval(($low+$high)/2);if($arr[$mid]==$search){//如果取出中間的下標(biāo)值跟你要搜索的值相等的話,直接去除值得下標(biāo)就行echo"你要查找的值在數(shù)組內(nèi)的下標(biāo)為".$mid;break;}elseif($arr[$mid] >$search){$high=$mid-1;}else{$high=$mid+1;}}