php實(shí)現(xiàn)二分法的查找其實(shí)很簡(jiǎn)單哟绊,跟我一起來看看怎么實(shí)現(xiàn)吧。
二分法查找需要數(shù)組是一個(gè)遞增的數(shù)組痰憎。
想要寫出二分法查找的代碼匿情,首先要懂得二分法實(shí)現(xiàn)查找的原理:
①要知道中間位置就需要知道起始位置和結(jié)束位置,然后取出中間位置的值來和我們的值做對(duì)比信殊。
②如果中間值大于我們的給定值炬称,說明我們的值在中間位置之前,此時(shí)需要再次二分涡拘,因?yàn)樵谥虚g之前玲躯,所以我們需要變的值是結(jié)束位置的值,此時(shí)結(jié)束位置的值應(yīng)該是我們此時(shí)的中間位置鳄乏。
③反之跷车,如果中間值小于我們給定的值,那么說明給定值在中間位置之后橱野,此時(shí)需要再次將后一部分的值進(jìn)行二分朽缴,因?yàn)樵谥虚g值之后,所以我們需要改變的值是開始位置的值水援,此時(shí)開始位置的值應(yīng)該是我們此時(shí)的中間位置密强,直到我們找到指定值茅郎。
④或者中間值等于最初的起始位置,或結(jié)束位置(此時(shí)說明給定值未找到)或渤。
下面就看看怎么實(shí)現(xiàn)二分法吧O等摺!薪鹦!
/*遞歸調(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ù)組的元素個(gè)數(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ù)組的長(zhǎng)度$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;}}