php 二分查找
//已经排序好的数组 二分查找--递归--返回数组的索引--返回-1 就是找不到 $left 最左边索引 $right--最右边索引 function twoFinds($array,$find,$left,$right){ //左边大于右边-超出查找范围-找不到数据 if($left>$right){ return -1; } //获取数组的中间值索引 echo $middle=ceil(($left+$right)/2); echo "<br/>"; //要查好的数组的中间值 $array_middle=$array[$middle]; //查找到数据 if($find==$array_middle){ return $middle; }else if($array_middle>$find){ //中间数据大于要查找数据--左边查找 return twoFinds($array,$find,0,$middle-1); }else{ //中间数据大于要查找数据--右边查找 return twoFinds($array,$find,$middle+1,$right); } } $array=[2,6,8,23,32,55,56,77,88,90]; echo count($array)-1; echo "<br/>"; echo twoFinds($array,77,0,count($array)-1);
//已经排序好的数组 二分查找--递归--返回数组的索引--返回-1 就是找不到 $left 最左边索引 $right--最右边索引 function twoFinds($array,$find,$left,$right){ //左边大于右边-超出查找范围-找不到数据 if($left>$right){ return -1; } //获取数组的中间值索引 $middle=ceil(($left+$right)/2); //要查好的数组的中间值 $array_middle=$array[$middle]; //查找到数据 if($find==$array_middle){ return $middle; }else if($array_middle>$find){ //中间数据大于要查找数据--左边查找 return twoFinds($array,$find,0,$middle-1); }else{ //中间数据大于要查找数据--右边查找 return twoFinds($array,$find,$middle+1,$right); } } //已经排序好的数组 二分查找--非递归--返回数组的索引--返回-1 就是找不到 $left 最左边索引 $right--最右边索引 function twoFinds1($array,$find,$left,$right){ //左右索引初始值 $ldefult=$left; $rdefult=$right; //建立循环查找,找到找不到再跳出循环 while (true){ //左边大于右边-超出查找范围-找不到数据 if($ldefult>$rdefult){ return -1; break; } //获取数组的中间值索引 $middle=ceil(($ldefult+$rdefult)/2); //要查好的数组的中间值 $array_middle=$array[$middle]; //找打啦 if($find==$array_middle){ return $middle; break; }else if($array_middle>$find){ //左边查找 //处理右边的边界 $rdefult=$middle-1; }else{ //右边查找 //处理左边的边界 $ldefult=$middle+1; } } } $array=[2,6,8,23,32,55,56,77,88,90]; echo count($array)-1; echo "<br/>"; echo twoFinds1($array,88,0,count($array)-1); echo "<br/>"; echo twoFinds($array,88,0,count($array)-1);
不逼一下自己,都不知道自己有多优秀!!!